LCOV - code coverage report
Current view: top level - dbaccess/source/core/dataaccess - ModelImpl.hxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 57 58 98.3 %
Date: 2012-08-25 Functions: 30 31 96.8 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 6 18 33.3 %

           Branch data     Line data    Source code
       1                 :            : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2                 :            : /*
       3                 :            :  * This file is part of the LibreOffice project.
       4                 :            :  *
       5                 :            :  * This Source Code Form is subject to the terms of the Mozilla Public
       6                 :            :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7                 :            :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8                 :            :  *
       9                 :            :  * This file incorporates work covered by the following license notice:
      10                 :            :  *
      11                 :            :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12                 :            :  *   contributor license agreements. See the NOTICE file distributed
      13                 :            :  *   with this work for additional information regarding copyright
      14                 :            :  *   ownership. The ASF licenses this file to you under the Apache
      15                 :            :  *   License, Version 2.0 (the "License"); you may not use this file
      16                 :            :  *   except in compliance with the License. You may obtain a copy of
      17                 :            :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18                 :            :  */
      19                 :            : 
      20                 :            : #ifndef _DBA_COREDATAACCESS_MODELIMPL_HXX_
      21                 :            : #define _DBA_COREDATAACCESS_MODELIMPL_HXX_
      22                 :            : 
      23                 :            : #include "apitools.hxx"
      24                 :            : #include "bookmarkcontainer.hxx"
      25                 :            : #include "ContentHelper.hxx"
      26                 :            : #include "core_resource.hxx"
      27                 :            : #include "documentevents.hxx"
      28                 :            : 
      29                 :            : #include <com/sun/star/beans/PropertyAttribute.hpp>
      30                 :            : #include <com/sun/star/beans/PropertyValue.hpp>
      31                 :            : #include <com/sun/star/beans/XPropertyAccess.hpp>
      32                 :            : #include <com/sun/star/container/XContainerListener.hpp>
      33                 :            : #include <com/sun/star/document/XDocumentSubStorageSupplier.hpp>
      34                 :            : #include <com/sun/star/document/XEventListener.hpp>
      35                 :            : #include <com/sun/star/document/XStorageBasedDocument.hpp>
      36                 :            : #include <com/sun/star/embed/ElementModes.hpp>
      37                 :            : #include <com/sun/star/embed/XStorage.hpp>
      38                 :            : #include <com/sun/star/embed/XTransactionListener.hpp>
      39                 :            : #include <com/sun/star/frame/XModel.hpp>
      40                 :            : #include <com/sun/star/frame/XStorable.hpp>
      41                 :            : #include <com/sun/star/lang/NotInitializedException.hpp>
      42                 :            : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
      43                 :            : #include <com/sun/star/lang/XServiceInfo.hpp>
      44                 :            : #include <com/sun/star/lang/XSingleServiceFactory.hpp>
      45                 :            : #include <com/sun/star/sdb/XBookmarksSupplier.hpp>
      46                 :            : #include <com/sun/star/sdb/XCompletedConnection.hpp>
      47                 :            : #include <com/sun/star/sdb/XFormDocumentsSupplier.hpp>
      48                 :            : #include <com/sun/star/sdb/XQueryDefinitionsSupplier.hpp>
      49                 :            : #include <com/sun/star/sdb/XReportDocumentsSupplier.hpp>
      50                 :            : #include <com/sun/star/sdbc/XDataSource.hpp>
      51                 :            : #include <com/sun/star/sdbc/XIsolatedConnection.hpp>
      52                 :            : #include <com/sun/star/sdbcx/XTablesSupplier.hpp>
      53                 :            : #include <com/sun/star/util/XCloseable.hpp>
      54                 :            : #include <com/sun/star/util/XFlushable.hpp>
      55                 :            : #include <com/sun/star/util/XModifiable.hpp>
      56                 :            : #include <com/sun/star/util/XNumberFormatsSupplier.hpp>
      57                 :            : #include <com/sun/star/util/XNumberFormatter.hpp>
      58                 :            : #include <com/sun/star/util/XRefreshable.hpp>
      59                 :            : #include <com/sun/star/sdb/XDocumentDataSource.hpp>
      60                 :            : #include <com/sun/star/frame/DoubleInitializationException.hpp>
      61                 :            : 
      62                 :            : #include <comphelper/broadcasthelper.hxx>
      63                 :            : #include <comphelper/namedvaluecollection.hxx>
      64                 :            : #include <comphelper/proparrhlp.hxx>
      65                 :            : #include <comphelper/sharedmutex.hxx>
      66                 :            : #include <connectivity/CommonTools.hxx>
      67                 :            : #include <cppuhelper/propshlp.hxx>
      68                 :            : #include <cppuhelper/weakref.hxx>
      69                 :            : #include <sfx2/docmacromode.hxx>
      70                 :            : #include <sfx2/docstoragemodifylistener.hxx>
      71                 :            : #include <unotools/sharedunocomponent.hxx>
      72                 :            : #include <osl/mutex.hxx>
      73                 :            : #include <rtl/ref.hxx>
      74                 :            : 
      75                 :            : #include <memory>
      76                 :            : 
      77                 :            : namespace comphelper
      78                 :            : {
      79                 :            :     class NamedValueCollection;
      80                 :            : }
      81                 :            : 
      82                 :            : //........................................................................
      83                 :            : namespace dbaccess
      84                 :            : {
      85                 :            : //........................................................................
      86                 :            : 
      87                 :            : typedef ::com::sun::star::uno::WeakReference< ::com::sun::star::sdbc::XConnection > OWeakConnection;
      88                 :            : typedef std::vector< OWeakConnection > OWeakConnectionArray;
      89                 :            : 
      90                 :        486 : struct AsciiPropertyValue
      91                 :            : {
      92                 :            :     // note: the canonic member order would be AsciiName / DefaultValue, but
      93                 :            :     // this crashes on unxlngi6.pro, since there's a bug which somehow results in
      94                 :            :     // getDefaultDataSourceSettings returning corrupted Any instances then.
      95                 :            :     ::com::sun::star::uno::Any          DefaultValue;
      96                 :            :     const sal_Char*                     AsciiName;
      97                 :            :     const ::com::sun::star::uno::Type&  ValueType;
      98                 :            : 
      99                 :          9 :     AsciiPropertyValue()
     100                 :            :         :DefaultValue( )
     101                 :            :         ,AsciiName( NULL )
     102                 :          9 :         ,ValueType( ::cppu::UnoType< ::cppu::UnoVoidType >::get() )
     103                 :            :     {
     104                 :          9 :     }
     105                 :            : 
     106                 :        450 :     AsciiPropertyValue( const sal_Char* _pAsciiName, const ::com::sun::star::uno::Any& _rDefaultValue )
     107                 :            :         :DefaultValue( _rDefaultValue )
     108                 :            :         ,AsciiName( _pAsciiName )
     109                 :        450 :         ,ValueType( _rDefaultValue.getValueType() )
     110                 :            :     {
     111                 :            :         OSL_ENSURE( ValueType.getTypeClass() != ::com::sun::star::uno::TypeClass_VOID,
     112                 :            :             "AsciiPropertyValue::AsciiPropertyValue: NULL values not allowed here, use the other CTOR for this!" );
     113                 :        450 :     }
     114                 :         27 :     AsciiPropertyValue( const sal_Char* _pAsciiName, const ::com::sun::star::uno::Type& _rValeType )
     115                 :            :         :DefaultValue()
     116                 :            :         ,AsciiName( _pAsciiName )
     117                 :         27 :         ,ValueType( _rValeType )
     118                 :            :     {
     119                 :            :         OSL_ENSURE( ValueType.getTypeClass() != ::com::sun::star::uno::TypeClass_VOID,
     120                 :            :             "AsciiPropertyValue::AsciiPropertyValue: VOID property values not supported!" );
     121                 :         27 :     }
     122                 :            : };
     123                 :            : 
     124                 :            : class ODatabaseContext;
     125                 :            : class OSharedConnectionManager;
     126                 :            : 
     127                 :            : //============================================================
     128                 :            : //= VosMutexFacade
     129                 :            : //============================================================
     130                 :            : /** a class which provides an IMutex interface to an OSL-based mutex
     131                 :            : */
     132         [ -  + ]:        190 : class VosMutexFacade : public ::osl::SolarMutex
     133                 :            : {
     134                 :            : public:
     135                 :            :     /** beware of life time: the mutex you pass here must live as least as long
     136                 :            :         as the VosMutexFacade instance lives.
     137                 :            :     */
     138                 :            :     VosMutexFacade( ::osl::Mutex& _rMutex );
     139                 :            : 
     140                 :            :     // IMutex
     141                 :            :     virtual void SAL_CALL acquire();
     142                 :            :     virtual sal_Bool SAL_CALL tryToAcquire();
     143                 :            :     virtual void SAL_CALL release();
     144                 :            : 
     145                 :            : private:
     146                 :            :     ::osl::Mutex&   m_rMutex;
     147                 :            : };
     148                 :            : 
     149                 :            : 
     150                 :            : //============================================================
     151                 :            : //= ODatabaseModelImpl
     152                 :            : //============================================================
     153                 :            : typedef ::utl::SharedUNOComponent< ::com::sun::star::embed::XStorage >  SharedStorage;
     154                 :            : 
     155                 :            : class ODatabaseContext;
     156                 :            : class DocumentStorageAccess;
     157                 :            : class OSharedConnectionManager;
     158                 :            : class ODatabaseModelImpl    :public ::rtl::IReference
     159                 :            :                             ,public ::sfx2::IMacroDocumentAccess
     160                 :            :                             ,public ::sfx2::IModifiableDocument
     161                 :            : {
     162                 :            : public:
     163                 :            :     enum ObjectType
     164                 :            :     {
     165                 :            :         E_FORM   = 0,
     166                 :            :         E_REPORT = 1,
     167                 :            :         E_QUERY  = 2,
     168                 :            :         E_TABLE  = 3
     169                 :            :     };
     170                 :            : 
     171                 :            :     enum EmbeddedMacros
     172                 :            :     {
     173                 :            :         // the database document (storage) itself contains macros
     174                 :            :         eDocumentWideMacros,
     175                 :            :         // there are sub document( storage)s containing macros
     176                 :            :         eSubDocumentMacros,
     177                 :            :         // there are no known macro( storage)s
     178                 :            :         eNoMacros
     179                 :            :     };
     180                 :            : 
     181                 :            : private:
     182                 :            :     OModuleClient                                                               m_aModuleClient;
     183                 :            :     ::com::sun::star::uno::WeakReference< ::com::sun::star::frame::XModel >     m_xModel;
     184                 :            :     ::com::sun::star::uno::WeakReference< ::com::sun::star::sdbc::XDataSource > m_xDataSource;
     185                 :            : 
     186                 :            :     DocumentStorageAccess*                                                      m_pStorageAccess;
     187                 :            :     ::comphelper::SharedMutex                                                   m_aMutex;
     188                 :            :     VosMutexFacade                                                              m_aMutexFacade;
     189                 :            :     ::std::vector< TContentPtr >                                                m_aContainer;   // one for each ObjectType
     190                 :            :     ::sfx2::DocumentMacroMode                                                   m_aMacroMode;
     191                 :            :     sal_Int16                                                                   m_nImposedMacroExecMode;
     192                 :            : 
     193                 :            :     ::com::sun::star::uno::Reference< ::com::sun::star::script::XStorageBasedLibraryContainer > m_xBasicLibraries;
     194                 :            :     ::com::sun::star::uno::Reference< ::com::sun::star::script::XStorageBasedLibraryContainer > m_xDialogLibraries;
     195                 :            : 
     196                 :            :     SharedStorage                                                               m_xDocumentStorage;
     197                 :            :     ::rtl::Reference< ::sfx2::DocumentStorageModifyListener >                   m_pStorageModifyListener;
     198                 :            :     ODatabaseContext*                                                           m_pDBContext;
     199                 :            :     DocumentEventsData                                                          m_aDocumentEvents;
     200                 :            : 
     201                 :            :     ::comphelper::NamedValueCollection                                          m_aMediaDescriptor;
     202                 :            :     /// the URL the document was loaded from
     203                 :            :     ::rtl::OUString                                                             m_sDocFileLocation;
     204                 :            : 
     205                 :            :     oslInterlockedCount                                 m_refCount;
     206                 :            : 
     207                 :            :     /// do we have any object (forms/reports) which contains macros?
     208                 :            :     ::boost::optional< EmbeddedMacros >                 m_aEmbeddedMacros;
     209                 :            : 
     210                 :            :     /// true if setting the Modified flag of the document is currently locked
     211                 :            :     bool                                                m_bModificationLock;
     212                 :            : 
     213                 :            :     /// true if and only if a database document existed previously (though meanwhile disposed), and was already initialized
     214                 :            :     bool                                                m_bDocumentInitialized;
     215                 :            : 
     216                 :            :     /** the URL which the document should report as it's URL
     217                 :            : 
     218                 :            :         This might differ from ->m_sDocFileLocation in case the document was loaded
     219                 :            :         as part of a crash recovery process. In this case, ->m_sDocFileLocation points to
     220                 :            :         the temporary file where the DB had been saved to, after a crash.
     221                 :            :         ->m_sDocumentURL then is the URL of the document which actually had
     222                 :            :         been recovered.
     223                 :            :     */
     224                 :            :     ::rtl::OUString                                     m_sDocumentURL;
     225                 :            : 
     226                 :            : public:
     227                 :            :     OWeakConnectionArray                                                        m_aConnections;
     228                 :            :     const ::comphelper::ComponentContext                                        m_aContext;
     229                 :            : 
     230                 :            : public:
     231                 :            :     ::com::sun::star::uno::WeakReference< ::com::sun::star::container::XNameAccess >    m_xCommandDefinitions;
     232                 :            :     ::com::sun::star::uno::WeakReference< ::com::sun::star::container::XNameAccess >    m_xTableDefinitions;
     233                 :            : 
     234                 :            :     ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatsSupplier >
     235                 :            :                                                         m_xNumberFormatsSupplier;
     236                 :            :     ::rtl::OUString                                     m_sConnectURL;
     237                 :            :     ::rtl::OUString                                     m_sName;        // transient, our creator has to tell us the title
     238                 :            :     ::rtl::OUString                                     m_sUser;
     239                 :            :     ::rtl::OUString                                     m_aPassword;    // transient !
     240                 :            :     ::rtl::OUString                                     m_sFailedPassword;
     241                 :            :     ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue>
     242                 :            :                                                         m_aLayoutInformation;
     243                 :            :     sal_Int32                                           m_nLoginTimeout;
     244                 :            :     sal_Bool                                            m_bReadOnly : 1;
     245                 :            :     sal_Bool                                            m_bPasswordRequired : 1;
     246                 :            :     sal_Bool                                            m_bSuppressVersionColumns : 1;
     247                 :            :     sal_Bool                                            m_bModified : 1;
     248                 :            :     sal_Bool                                            m_bDocumentReadOnly : 1;
     249                 :            :     ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyAccess >
     250                 :            :                                                         m_xSettings;
     251                 :            :     ::com::sun::star::uno::Sequence< ::rtl::OUString >  m_aTableFilter;
     252                 :            :     ::com::sun::star::uno::Sequence< ::rtl::OUString >  m_aTableTypeFilter;
     253                 :            :     OSharedConnectionManager*                           m_pSharedConnectionManager;
     254                 :            :     ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >
     255                 :            :                                                         m_xSharedConnectionManager;
     256                 :            :     sal_uInt16                                          m_nControllerLockCount;
     257                 :            : 
     258                 :            :     void reset();
     259                 :            : 
     260                 :            :     /** determines whether the database document has an embedded data storage
     261                 :            :     */
     262                 :        284 :     inline bool isEmbeddedDatabase() const { return ( m_sConnectURL.compareToAscii( "sdbc:embedded:", 14 ) == 0 ); }
     263                 :            : 
     264                 :            :     /** stores the embedded storage ("database")
     265                 :            : 
     266                 :            :         @param _bPreventRootCommits
     267                 :            :             Normally, committing the embedded storage results in also commiting the root storage
     268                 :            :             - this is an automatism for data safety reasons.
     269                 :            :             If you pass <TRUE/> here, committing the root storage is prevented for this particular
     270                 :            :             call.
     271                 :            :         @return <TRUE/> if the storage could be commited, otherwise <FALSE/>
     272                 :            :     */
     273                 :            :     bool        commitEmbeddedStorage( bool _bPreventRootCommits = false );
     274                 :            : 
     275                 :            :     /// commits all sub storages
     276                 :            :     void commitStorages()
     277                 :            :             SAL_THROW(( ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException ));
     278                 :            : 
     279                 :            :     ODatabaseModelImpl(
     280                 :            :         const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory,
     281                 :            :         ODatabaseContext& _pDBContext
     282                 :            :     );
     283                 :            :     virtual ~ODatabaseModelImpl();
     284                 :            : 
     285                 :            :     ODatabaseModelImpl(
     286                 :            :         const ::rtl::OUString& _rRegistrationName,
     287                 :            :         const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory,
     288                 :            :         ODatabaseContext& _rDBContext
     289                 :            :         );
     290                 :            : 
     291                 :            :     // XEventListener
     292                 :            :     void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw(::com::sun::star::uno::RuntimeException);
     293                 :            : 
     294                 :            :     void setModified( sal_Bool bModified );
     295                 :            : 
     296                 :            :     void dispose();
     297                 :            : 
     298                 :        794 :     inline ::rtl::OUString getURL() const               { return m_sDocumentURL;     }
     299                 :        176 :     inline ::rtl::OUString getDocFileLocation() const   { return m_sDocFileLocation; }
     300                 :            : 
     301                 :            :     ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >
     302                 :            :             getStorage(
     303                 :            :                 const ObjectType _eType, const sal_Int32 _nDesiredMode = ::com::sun::star::embed::ElementModes::READWRITE );
     304                 :            : 
     305                 :            : // helper
     306                 :            :     const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatsSupplier >&
     307                 :            :             getNumberFormatsSupplier();
     308                 :            : 
     309                 :            :     DocumentEventsData&
     310                 :        186 :             getDocumentEvents() { return m_aDocumentEvents; }
     311                 :            : 
     312                 :            :     const ::comphelper::NamedValueCollection&
     313                 :          6 :             getMediaDescriptor() const { return m_aMediaDescriptor; }
     314                 :            : 
     315                 :            :     void    setResource(
     316                 :            :                 const ::rtl::OUString& _rURL,
     317                 :            :                 const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& _rArgs
     318                 :            :             );
     319                 :            :     void    setDocFileLocation(
     320                 :            :                 const ::rtl::OUString& i_rLoadedFrom
     321                 :            :             );
     322                 :            : 
     323                 :            :     static ::comphelper::NamedValueCollection
     324                 :            :             stripLoadArguments( const ::comphelper::NamedValueCollection& _rArguments );
     325                 :            : 
     326                 :            : // other stuff
     327                 :            :     void    flushTables();
     328                 :            : 
     329                 :            :     // disposes all elements in m_aStorages, and clears it
     330                 :            :     void    disposeStorages() SAL_THROW(());
     331                 :            : 
     332                 :            :     /// creates a ->com::sun::star::embed::StorageFactory
     333                 :            :     ::com::sun::star::uno::Reference< ::com::sun::star::lang::XSingleServiceFactory >
     334                 :            :             createStorageFactory() const;
     335                 :            : 
     336                 :            :     /// commits our storage
     337                 :            :     void    commitRootStorage();
     338                 :            : 
     339                 :            :     /// commits a given storage if it's not readonly, ignoring (but asserting) all errors
     340                 :            :     static  bool    commitStorageIfWriteable_ignoreErrors(
     341                 :            :                 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& _rxStorage
     342                 :            :             )
     343                 :            :             SAL_THROW(());
     344                 :            : 
     345                 :            :     void clearConnections();
     346                 :            : 
     347                 :            :             ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > getOrCreateRootStorage();
     348                 :        172 :     inline  ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > getRootStorage() const { return m_xDocumentStorage.getTyped(); }
     349         [ +  - ]:         14 :     inline  void resetRootStroage() { impl_switchToStorage_throw( NULL ); }
     350                 :            : 
     351                 :            :     /** returns the data source. If it doesn't exist it will be created
     352                 :            :     */
     353                 :            :     ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDataSource> getOrCreateDataSource();
     354                 :            : 
     355                 :            :     /** returns the model, if there already exists one
     356                 :            :     */
     357                 :            :     ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > getModel_noCreate() const;
     358                 :            : 
     359                 :            :     /** returns a new ->ODatabaseDocument
     360                 :            : 
     361                 :            :         @param _bInitializeIfNecessary
     362                 :            :             calls XLoadable::initNew on the newly created model, if necessary
     363                 :            : 
     364                 :            :         @precond
     365                 :            :             No ->ODatabaseDocument exists so far
     366                 :            : 
     367                 :            :         @seealso
     368                 :            :             getModel_noCreate
     369                 :            :     */
     370                 :            :     ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > createNewModel_deliverOwnership( bool _bInitialize );
     371                 :            : 
     372                 :        186 :     struct ResetModelAccess { friend class ODatabaseDocument; private: ResetModelAccess() { } };
     373                 :            : 
     374                 :            :     /** resets the model to NULL
     375                 :            : 
     376                 :            :         Only to be called when the model is being disposed
     377                 :            :     */
     378                 :            :     void    modelIsDisposing( const bool _wasInitialized, ResetModelAccess );
     379                 :            : 
     380                 :        186 :     bool    hadInitializedDocument() const { return m_bDocumentInitialized; }
     381                 :            : 
     382                 :            :     DocumentStorageAccess*
     383                 :            :             getDocumentStorageAccess();
     384                 :            : 
     385                 :            :     ::com::sun::star::uno::Reference< ::com::sun::star::document::XDocumentSubStorageSupplier >
     386                 :            :             getDocumentSubStorageSupplier();
     387                 :            : 
     388                 :        590 :     inline const ::comphelper::SharedMutex& getSharedMutex() const { return m_aMutex; }
     389                 :            : 
     390                 :            :     /** @see osl_incrementInterlockedCount.
     391                 :            :      */
     392                 :            :     virtual oslInterlockedCount SAL_CALL acquire();
     393                 :            : 
     394                 :            :     /** @see osl_decrementInterlockedCount.
     395                 :            :      */
     396                 :            :     virtual oslInterlockedCount SAL_CALL release();
     397                 :            : 
     398                 :            :     /// returns a all known data source settings, including their default values
     399                 :            :     static const AsciiPropertyValue* getDefaultDataSourceSettings();
     400                 :            : 
     401                 :            :     /** retrieves the requested container of objects (forms/reports/tables/queries)
     402                 :            :     */
     403                 :            :     TContentPtr&    getObjectContainer( const ObjectType _eType );
     404                 :            : 
     405                 :            :     /** returns the name of the storage which is used to stored objects of the given type, if applicable
     406                 :            :     */
     407                 :            :     static ::rtl::OUString
     408                 :            :                     getObjectContainerStorageName( const ObjectType _eType );
     409                 :            : 
     410                 :            :     /** revokes the data source registration at the database context
     411                 :            :     */
     412                 :            :     void            revokeDataSource() const;
     413                 :            : 
     414                 :            :     /** determines whether a given object storage contains macros
     415                 :            :     */
     416                 :            :     static bool     objectHasMacros(
     417                 :            :                         const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& _rxContainerStorage,
     418                 :            :                         const ::rtl::OUString& _rPersistentName
     419                 :            :                     );
     420                 :            : 
     421                 :            :     /** determines which kind of embedded macros are present in the document
     422                 :            :     */
     423                 :            :     EmbeddedMacros  determineEmbeddedMacros();
     424                 :            : 
     425                 :            :     /** checks our document's macro execution mode, using the interaction handler as supplied with our
     426                 :            :         load arguments
     427                 :            :     */
     428                 :            :     bool            checkMacrosOnLoading();
     429                 :            : 
     430                 :            :     /** adjusts our document's macro execution mode, without using any UI, assuming the user
     431                 :            :         would reject execution of macros, if she would have been asked.
     432                 :            : 
     433                 :            :         If checkMacrosOnLoading has been called before (and thus the macro execution mode
     434                 :            :         is already adjusted), then the current execution mode is simply returned.
     435                 :            : 
     436                 :            :         @return
     437                 :            :             whether or not macro execution is allowed
     438                 :            :     */
     439                 :            :     bool            adjustMacroMode_AutoReject();
     440                 :            : 
     441                 :            :     /** resets our macro execute mode, so next time  the checkMacrosOnLoading is called, it will
     442                 :            :         behave as if it has never been called before
     443                 :            :     */
     444                 :            :     void            resetMacroExecutionMode();
     445                 :            : 
     446                 :            :     /** ensures that ->m_xBasicLibraries resp. m_xDialogLibraries exists
     447                 :            : 
     448                 :            :         @return
     449                 :            :             the requested library container. Is never <NULL/>.
     450                 :            : 
     451                 :            :         @throws RuntimeException
     452                 :            :             if something does wrong, which indicates a server error in the installation
     453                 :            :     */
     454                 :            :     ::com::sun::star::uno::Reference< ::com::sun::star::script::XStorageBasedLibraryContainer >
     455                 :            :             getLibraryContainer( bool _bScript );
     456                 :            : 
     457                 :            :     /** lets our library containers store themself into the given root storage
     458                 :            :     */
     459                 :            :     void    storeLibraryContainersTo( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& _rxToRootStorage );
     460                 :            : 
     461                 :            :     /** rebases the document to the given storage
     462                 :            : 
     463                 :            :         No actual committing, copying, saving, whatsoever happens. The storage is just remembered as the documents
     464                 :            :         new storage, nothing more.
     465                 :            : 
     466                 :            :         @throws ::com::sun::star::lang::IllegalArgumentException
     467                 :            :             if the given storage is <NULL/>
     468                 :            :         @throws ::com::sun::star::lang::RuntimeException
     469                 :            :             if any of the invoked operations does so
     470                 :            :     */
     471                 :            :     ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >
     472                 :            :             switchToStorage(
     473                 :            :                 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& _rxNewRootStorage
     474                 :            :             );
     475                 :            : 
     476                 :            :     /** returns the macro mode imposed by an external instance, which passed it to attachResource
     477                 :            :     */
     478                 :         14 :     sal_Int16       getImposedMacroExecMode() const
     479                 :            :     {
     480                 :         14 :         return m_nImposedMacroExecMode;
     481                 :            :     }
     482                 :         14 :     void            setImposedMacroExecMode( const sal_Int16 _nMacroMode )
     483                 :            :     {
     484                 :         14 :         m_nImposedMacroExecMode = _nMacroMode;
     485                 :         14 :     }
     486                 :            : 
     487                 :            : public:
     488                 :            :     // IMacroDocumentAccess overridables
     489                 :            :     virtual sal_Int16 getCurrentMacroExecMode() const;
     490                 :            :     virtual sal_Bool setCurrentMacroExecMode( sal_uInt16 );
     491                 :            :     virtual ::rtl::OUString getDocumentLocation() const;
     492                 :            :     virtual ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > getZipStorageToSign();
     493                 :            :     virtual sal_Bool documentStorageHasMacros() const;
     494                 :            :     virtual ::com::sun::star::uno::Reference< ::com::sun::star::document::XEmbeddedScripts > getEmbeddedDocumentScripts() const;
     495                 :            :     virtual sal_Int16 getScriptingSignatureState();
     496                 :            :     virtual sal_Bool hasTrustedScriptingSignature( sal_Bool bAllowUIToAddAuthor );
     497                 :            :     virtual void showBrokenSignatureWarning( const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& _rxInteraction ) const;
     498                 :            : 
     499                 :            :     // IModifiableDocument
     500                 :            :     virtual void storageIsModified();
     501                 :            : 
     502                 :            :     // don't use directly, use the ModifyLock class instead
     503                 :        174 :     void    lockModify()              { m_bModificationLock = true; }
     504                 :        174 :     void    unlockModify()            { m_bModificationLock = false; }
     505                 :       2326 :     bool    isModifyLocked() const    { return m_bModificationLock; }
     506                 :            : 
     507                 :            : private:
     508                 :            :     void    impl_construct_nothrow();
     509                 :            :     ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >
     510                 :            :             impl_switchToStorage_throw( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& _rxNewRootStorage );
     511                 :            : 
     512                 :            :     /** switches to the given document URL, which denotes the logical URL of the document, not necessariy the
     513                 :            :         URL where the doc was loaded/recovered from
     514                 :            :     */
     515                 :            :     void    impl_switchToLogicalURL(
     516                 :            :                 const ::rtl::OUString& i_rDocumentURL
     517                 :            :             );
     518                 :            : 
     519                 :            : };
     520                 :            : 
     521                 :            : /** a small base class for UNO components whose functionality depends on a ODatabaseModelImpl
     522                 :            : */
     523                 :            : class ModelDependentComponent
     524                 :            : {
     525                 :            : protected:
     526                 :            :     ::rtl::Reference< ODatabaseModelImpl >  m_pImpl;
     527                 :            :     mutable ::comphelper::SharedMutex       m_aMutex;
     528                 :            : 
     529                 :            : protected:
     530                 :            :     ModelDependentComponent( const ::rtl::Reference< ODatabaseModelImpl >& _model );
     531                 :            :     virtual ~ModelDependentComponent();
     532                 :            : 
     533                 :            :     /** returns the component itself
     534                 :            :     */
     535                 :            :     virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > getThis() const = 0;
     536                 :            : 
     537                 :      10796 :     inline ::osl::Mutex& getMutex() const
     538                 :            :     {
     539                 :      10796 :         return m_aMutex;
     540                 :            :     }
     541                 :            : 
     542                 :            : public:
     543                 :       8468 :     struct GuardAccess { friend class ModelMethodGuard; private: GuardAccess() { } };
     544                 :            : 
     545                 :            :     /** returns the mutex used for thread safety
     546                 :            : 
     547                 :            :         @throws ::com::sun::star::lang::DisposedException
     548                 :            :             if m_pImpl is <NULL/>. Usually, you will set this member in your derived
     549                 :            :             component's <code>dispose</code> method to <NULL/>.
     550                 :            :     */
     551                 :       8468 :     inline ::osl::Mutex& getMutex( GuardAccess ) const
     552                 :            :     {
     553                 :       8468 :         return getMutex();
     554                 :            :     }
     555                 :            :     inline ::rtl::Reference< ODatabaseModelImpl > getImpl( GuardAccess ) const
     556                 :            :     {
     557                 :            :         return m_pImpl;
     558                 :            :     }
     559                 :            : 
     560                 :            :     /// checks whether the component is already disposed, throws a DisposedException if so
     561                 :       8656 :     inline void checkDisposed() const
     562                 :            :     {
     563         [ -  + ]:       8656 :         if ( !m_pImpl.is() )
     564 [ #  # ][ #  # ]:          0 :             throw ::com::sun::star::lang::DisposedException( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Component is already disposed.")), getThis() );
                 [ #  # ]
     565                 :       8656 :     }
     566                 :            : 
     567                 :        174 :     inline void lockModify()
     568                 :            :     {
     569                 :        174 :         m_pImpl->lockModify();
     570                 :        174 :     }
     571                 :            : 
     572                 :        174 :     inline void unlockModify()
     573                 :            :     {
     574                 :        174 :         m_pImpl->unlockModify();
     575                 :        174 :     }
     576                 :            : };
     577                 :            : 
     578                 :            : class ModifyLock
     579                 :            : {
     580                 :            : public:
     581                 :        174 :     ModifyLock( ModelDependentComponent& _component )
     582                 :        174 :         :m_rComponent( _component )
     583                 :            :     {
     584                 :        174 :         m_rComponent.lockModify();
     585                 :        174 :     }
     586                 :            : 
     587                 :        174 :     ~ModifyLock()
     588                 :            :     {
     589                 :        174 :         m_rComponent.unlockModify();
     590                 :        174 :     }
     591                 :            : 
     592                 :            : private:
     593                 :            :     ModelDependentComponent&    m_rComponent;
     594                 :            : };
     595                 :            : 
     596                 :            : /** a guard for public methods of objects dependent on a ODatabaseModelImpl instance
     597                 :            : 
     598                 :            :     Just put this guard onto the stack at the beginning of your method. Don't bother yourself
     599                 :            :     with a MutexGuard, checks for being disposed, and the like.
     600                 :            : */
     601                 :            : class ModelMethodGuard : public ::osl::ResettableMutexGuard
     602                 :            : {
     603                 :            : private:
     604                 :            :     typedef ::osl::ResettableMutexGuard             BaseMutexGuard;
     605                 :            : 
     606                 :            : public:
     607                 :            :     /** constructs the guard
     608                 :            : 
     609                 :            :         @param _component
     610                 :            :             the component whose functionality depends on a ODatabaseModelImpl instance
     611                 :            : 
     612                 :            :         @throws ::com::sun::star::lang::DisposedException
     613                 :            :             If the given component is already disposed
     614                 :            :     */
     615                 :       8468 :     ModelMethodGuard( const ModelDependentComponent& _component )
     616 [ +  - ][ +  - ]:       8468 :         :BaseMutexGuard( _component.getMutex( ModelDependentComponent::GuardAccess() ) )
     617                 :            :     {
     618         [ +  - ]:       8468 :         _component.checkDisposed();
     619                 :       8468 :     }
     620                 :            : 
     621                 :       8468 :     ~ModelMethodGuard()
     622                 :       8468 :     {
     623                 :       8468 :     }
     624                 :            : };
     625                 :            : 
     626                 :            : //........................................................................
     627                 :            : }   // namespace dbaccess
     628                 :            : //........................................................................
     629                 :            : 
     630                 :            : #endif // _DBA_COREDATAACCESS_DATALINK_HXX_
     631                 :            : 
     632                 :            : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10