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]

Reply via email to