User: obo Date: 2006/07/10 08:14:06 Modified: dba/dbaccess/source/core/inc/definitioncontainer.hxx
Log: INTEGRATION: CWS qiq (1.4.4); FILE MERGED 2006/06/16 11:47:40 fs 1.4.4.3: during #i51143#: refactored VCollection: - createEmptyObject now named createDescriptor - cloneObject removed - appendObject now returns the newly created object (previously done via a subsequent call to cloneObject) 2006/05/24 14:54:55 fs 1.4.4.2: #i51143# be an XContainerApproveBroadcaster 2006/05/24 09:09:57 fs 1.4.4.1: #i51143# File Changes: Directory: /dba/dbaccess/source/core/inc/ ========================================= File [changed]: definitioncontainer.hxx Url: http://dba.openoffice.org/source/browse/dba/dbaccess/source/core/inc/definitioncontainer.hxx?r1=1.4&r2=1.5 Delta lines: +126 -33 ---------------------- --- definitioncontainer.hxx 4 May 2006 08:38:22 -0000 1.4 +++ definitioncontainer.hxx 10 Jul 2006 15:14:03 -0000 1.5 @@ -39,8 +39,8 @@ #ifndef _CPPUHELPER_INTERFACECONTAINER_HXX_ #include <cppuhelper/interfacecontainer.hxx> #endif -#ifndef _CPPUHELPER_IMPLBASE6_HXX_ -#include <cppuhelper/implbase6.hxx> +#ifndef _CPPUHELPER_IMPLBASE7_HXX_ +#include <cppuhelper/implbase7.hxx> #endif #ifndef _COMPHELPER_STLTYPES_HXX_ #include <comphelper/stl_types.hxx> @@ -75,9 +75,15 @@ #ifndef _COM_SUN_STAR_BEANS_XVETOABLECHANGELISTENER_HPP_ #include <com/sun/star/beans/XVetoableChangeListener.hpp> #endif +#ifndef _COM_SUN_STAR_CONTAINER_XCONTAINERAPPROVEBROADCASTER_HPP_ +#include <com/sun/star/container/XContainerApproveBroadcaster.hpp> +#endif #ifndef DBA_CONTENTHELPER_HXX #include "ContentHelper.hxx" #endif +#ifndef DBACCESS_CONTAINERAPPROVE_HXX +#include "containerapprove.hxx" +#endif #ifndef _COMPHELPER_UNO3_HXX_ #include <comphelper/uno3.hxx> #endif @@ -93,21 +99,44 @@ class ODefinitionContainer_Impl : public OContentHelper_Impl { public: - DECLARE_STL_USTRINGACCESS_MAP(TContentPtr, Documents); - // DECLARE_STL_VECTOR(Documents::iterator, DocumentsIndexAccess); + typedef ::std::map< ::rtl::OUString, TContentPtr > NamedDefinitions; + typedef NamedDefinitions::iterator iterator; + typedef NamedDefinitions::const_iterator const_iterator; - // DocumentsIndexAccess m_aDocuments; // for a efficient index access - Documents m_aDocumentMap; // for a efficient name access +private: + NamedDefinitions m_aDefinitions; + +public: + inline size_t size() const { return m_aDefinitions.size(); } + + inline const_iterator begin() const { return m_aDefinitions.begin(); } + inline const_iterator end() const { return m_aDefinitions.end(); } + + inline const_iterator find( const ::rtl::OUString& _rName ) const { return m_aDefinitions.find( _rName ); } + const_iterator find( TContentPtr _pDefinition ) const; + + inline void erase( const ::rtl::OUString& _rName ) { m_aDefinitions.erase( _rName ); } + void erase( TContentPtr _pDefinition ); + + inline void insert( const ::rtl::OUString& _rName, TContentPtr _pDefinition ) + { + m_aDefinitions.insert( NamedDefinitions::value_type( _rName, _pDefinition ) ); + } + +private: + iterator find( TContentPtr _pDefinition ); + // (for the moment, this is private. Make it public if needed. If really needed.) }; //========================================================================== //= ODefinitionContainer - base class of collections of database definition //= documents //========================================================================== -typedef ::cppu::ImplHelper6< ::com::sun::star::container::XIndexAccess +typedef ::cppu::ImplHelper7 < ::com::sun::star::container::XIndexAccess , ::com::sun::star::container::XNameContainer , ::com::sun::star::container::XEnumerationAccess , ::com::sun::star::container::XContainer + , ::com::sun::star::container::XContainerApproveBroadcaster , ::com::sun::star::beans::XPropertyChangeListener , ::com::sun::star::beans::XVetoableChangeListener > ODefinitionContainer_Base; @@ -116,16 +145,26 @@ :public OContentHelper ,public ODefinitionContainer_Base { -public: +protected: DECLARE_STL_USTRINGACCESS_MAP(::com::sun::star::uno::WeakReference< ::com::sun::star::ucb::XContent >, Documents); DECLARE_STL_VECTOR(Documents::iterator, DocumentsIndexAccess); - enum ENotifyKind + enum ContainerOperation { E_REPLACED, E_REMOVED, E_INSERTED }; + + enum ListenerType + { + ApproveListeners, + ContainerListemers + }; + +private: + PContainerApprove m_pElementApproval; + protected: // we can't just hold a vector of XContentRefs, as after initialization they're all empty // cause we load them only on access @@ -133,12 +172,35 @@ Documents m_aDocumentMap; // for a efficient name access ::cppu::OInterfaceContainerHelper + m_aApproveListeners; + ::cppu::OInterfaceContainerHelper m_aContainerListeners; + sal_Bool m_bInPropertyChange; - /** looks like the dtor ... +protected: + /** Additionally to our own approvals which new elements must pass, derived classes + can specifiy an additional approval instance here. + + Every time a new element is inserted into the container (or an element is replaced + with a new one), this new element must pass our own internal approval, plus the approval + given here. */ + void setElementApproval( PContainerApprove _pElementApproval ) { m_pElementApproval = _pElementApproval; } + PContainerApprove getElementApproval() const { return m_pElementApproval; } + +protected: virtual ~ODefinitionContainer(); + + inline const ODefinitionContainer_Impl& getDefinitions() const + { + return dynamic_cast< const ODefinitionContainer_Impl& >( *m_pImpl.get() ); + } + + inline ODefinitionContainer_Impl& getDefinitions() + { + return dynamic_cast< ODefinitionContainer_Impl& >( *m_pImpl.get() ); + } public: /** constructs the container. */ @@ -184,6 +246,10 @@ virtual void SAL_CALL addContainerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::container::XContainerListener >& xListener ) throw(::com::sun::star::uno::RuntimeException); virtual void SAL_CALL removeContainerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::container::XContainerListener >& xListener ) throw(::com::sun::star::uno::RuntimeException); + // XContainerApproveBroadcaster + virtual void SAL_CALL addContainerApproveListener( const ::com::sun::star::uno::Reference< ::com::sun::star::container::XContainerApproveListener >& Listener ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL removeContainerApproveListener( const ::com::sun::star::uno::Reference< ::com::sun::star::container::XContainerApproveListener >& Listener ) throw (::com::sun::star::uno::RuntimeException); + // ::com::sun::star::lang::XEventListener virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw(::com::sun::star::uno::RuntimeException); @@ -191,15 +257,11 @@ virtual void SAL_CALL propertyChange( const ::com::sun::star::beans::PropertyChangeEvent& evt ) throw (::com::sun::star::uno::RuntimeException); // XVetoableChangeListener virtual void SAL_CALL vetoableChange( const ::com::sun::star::beans::PropertyChangeEvent& aEvent ) throw (::com::sun::star::beans::PropertyVetoException, ::com::sun::star::uno::RuntimeException); + protected: // helper virtual void SAL_CALL disposing(); - /** approve that the object given may be inserted into the container. Should be overloaded by derived classes, - the default implementation just checks the object to be non-void. - */ - virtual sal_Bool approveNewObject(const ::rtl::OUString& _sName,const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XContent >& _rxObject) const; - /** create a object from it's persistent data within the configuration. To be overwritten by derived classes. @param _rName the name the object has within the container @return the newly created object or an empty reference if somthing went wrong @@ -209,14 +271,14 @@ /** get the object specified by the given name. If desired, the object will be read if not already done so.<BR> @param _rName the object name - @param _bReadIfNeccessary if sal_True, the object will be read from the configuration if not already done so + @param _bReadIfNeccessary if sal_True, the object will be created if necessary @return the property set interface of the object. Usually the return value is not NULL, but if so, then the object could not be read from the configuration @throws NoSuchElementException if there is no object with the given name. @see createObject */ virtual ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XContent > - implGetByName(const ::rtl::OUString& _rName, sal_Bool _bReadIfNeccessary = sal_True) throw (::com::sun::star::container::NoSuchElementException); + implGetByName(const ::rtl::OUString& _rName, sal_Bool _bCreateIfNecessary) throw (::com::sun::star::container::NoSuchElementException); /** quickly checks if there already is an element with a given name. No access to the configuration occures, i.e. if there is such an object which is not already loaded, it won't be loaded now. @@ -267,17 +329,48 @@ const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XContent >& _rxNewObject ); - void notifyByName( ::osl::ClearableMutexGuard& _rGuard - ,const ::rtl::OUString& _rName - ,const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XContent >& _xNewElement - ,const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XContent >& xOldElement - ,ENotifyKind _eHowToNotify); -private: + /** notifies our container/approve listeners + */ + void notifyByName( + ::osl::ResettableMutexGuard& _rGuard, + const ::rtl::OUString& _rName, + const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XContent >& _xNewElement, + const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XContent >& xOldElement, + ContainerOperation _eOperation, + ListenerType _eType + ); + + inline SAL_CALL operator ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > () const + { + return const_cast< XContainer* >( static_cast< const XContainer* >( this ) ); + } - void implInsert(const ::rtl::OUString& _rName, const ::com::sun::star::uno::Any& aElement); +private: void addObjectListener(const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XContent >& _xNewObject); void removeObjectListener(const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XContent >& _xNewObject); + + /** approve that the object given may be inserted into the container. Should be overloaded by derived classes, + the default implementation just checks the object to be non-void. + + @throws IllegalArgumentException + if the name or the object are invalid + @throws ElementExistException + if the object already exists in the container, or another object with the same name + already exists + @throws WrappedTargetException + if another error occures which prevents insertion of the object into the container + */ + void approveNewObject( + const ::rtl::OUString& _sName, + const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XContent >& _rxObject + ) const; + + inline bool impl_haveAnyListeners_nothrow() const + { + return ( m_aContainerListeners.getLength() > 0 ) || ( m_aApproveListeners.getLength() > 0 ); + } }; + //........................................................................ } // namespace dbaccess //........................................................................ --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
