Tag: cws_src680_fwk29
User: fs      
Date: 06/01/12 00:17:31

Modified:
 /dba/dbaccess/source/core/dataaccess/
  databasedocument.cxx

Log:
 #i60398# better defined ownership of m_xForms/m_xReports: now owned by the 
model exclusively, properly parented all the time, and properly disposed when 
document is closing

File Changes:

Directory: /dba/dbaccess/source/core/dataaccess/
================================================

File [changed]: databasedocument.cxx
Url: 
http://dba.openoffice.org/source/browse/dba/dbaccess/source/core/dataaccess/databasedocument.cxx?r1=1.23&r2=1.23.4.1
Delta lines:  +69 -71
---------------------
--- databasedocument.cxx        21 Dec 2005 13:34:54 -0000      1.23
+++ databasedocument.cxx        12 Jan 2006 08:17:28 -0000      1.23.4.1
@@ -4,9 +4,9 @@
  *
  *  $RCSfile: databasedocument.cxx,v $
  *
- *  $Revision: 1.23 $
+ *  $Revision: 1.23.4.1 $
  *
- *  last change: $Author: obo $ $Date: 2005/12/21 13:34:54 $
+ *  last change: $Author: fs $ $Date: 2006/01/12 08:17:28 $
  *
  *  The Contents of this file are made available subject to
  *  the terms of GNU Lesser General Public License Version 2.1.
@@ -182,19 +182,15 @@
     {
         OSL_ENSURE(0,"Could not create GlobalEventBroadcaster!");
     }
-       Reference<XChild> xChild(m_pImpl->m_xForms.get(),UNO_QUERY);
-       if ( xChild.is() )
-               xChild->setParent(static_cast<OWeakObject*>(this));
 
-       xChild.set(m_pImpl->m_xReports.get(),UNO_QUERY);
-       if ( xChild.is() )
-               xChild->setParent(static_cast<OWeakObject*>(this));
-       xChild.set(m_pImpl->m_xTableDefinitions.get(),UNO_QUERY);
-       if ( xChild.is() )
-               xChild->setParent(static_cast<OWeakObject*>(this));
-       xChild.set(m_pImpl->m_xCommandDefinitions.get(),UNO_QUERY);
-       if ( xChild.is() )
-               xChild->setParent(static_cast<OWeakObject*>(this));
+    osl_incrementInterlockedCount( &m_refCount );
+    {
+        impl_reparent_nothrow( m_xForms );
+        impl_reparent_nothrow( m_xReports );
+        impl_reparent_nothrow( m_pImpl->m_xTableDefinitions );
+        impl_reparent_nothrow( m_pImpl->m_xCommandDefinitions );
+    }
+    osl_decrementInterlockedCount( &m_refCount );
 }
 //--------------------------------------------------------------------------
 ODatabaseDocument::~ODatabaseDocument()
@@ -254,15 +250,11 @@
 
         if ( m_pImpl->m_bOwnStorage )
                    ::comphelper::disposeComponent(m_pImpl->m_xStorage);
-               Reference< XNameAccess > xContainer = m_pImpl->m_xForms;
-               ::comphelper::disposeComponent(xContainer);
-               xContainer = m_pImpl->m_xReports;
-               ::comphelper::disposeComponent(xContainer);
-               xContainer = m_pImpl->m_xTableDefinitions;
-               ::comphelper::disposeComponent(xContainer);
 
-               xContainer = m_pImpl->m_xCommandDefinitions;
-               ::comphelper::disposeComponent(xContainer);
+        impl_clearObjectContainer( m_xForms );
+               impl_clearObjectContainer( m_xReports );
+               impl_clearObjectContainer( m_pImpl->m_xTableDefinitions );
+               impl_clearObjectContainer( m_pImpl->m_xCommandDefinitions );
 
                m_pImpl->m_aContainer.clear();
                m_pImpl->lateInit();
@@ -670,6 +662,53 @@
 {
 }
 // 
-----------------------------------------------------------------------------
+void ODatabaseDocument::impl_reparent_nothrow( const WeakReference< 
XNameAccess >& _rxContainer )
+{
+       Reference< XChild > xChild( _rxContainer.get(), UNO_QUERY );
+       if  ( xChild.is() )
+               xChild->setParent( *this );
+}
+// 
-----------------------------------------------------------------------------
+void ODatabaseDocument::impl_clearObjectContainer( WeakReference< XNameAccess 
>& _rxContainer, bool _bResetAndRelease )
+{
+    Reference< XNameAccess > xContainer = _rxContainer;
+    ::comphelper::disposeComponent( xContainer );
+
+    if ( _bResetAndRelease )
+    {
+               Reference< XChild > xChild( _rxContainer.get(),UNO_QUERY );
+               if ( xChild.is() )
+                       xChild->setParent( NULL );
+        _rxContainer = Reference< XNameAccess >();
+    }
+}
+// 
-----------------------------------------------------------------------------
+Reference< XNameAccess > ODatabaseDocument::impl_getDocumentContainer_throw( 
ODatabaseModelImpl::ObjectType _eType )
+{
+    ModelMethodGuard aGuard( *this );
+    OSL_POSTCOND( m_pImpl.is(), 
"ODatabaseDocument::impl_getDocumentContainer_throw: Impl is NULL" );
+
+    if ( ( _eType != ODatabaseModelImpl::E_FORM ) && ( _eType != 
ODatabaseModelImpl::E_REPORT ) )
+        throw IllegalArgumentException();
+
+    bool bFormsContainer = _eType == ODatabaseModelImpl::E_FORM;
+
+    WeakReference< XNameAccess >& rContainerRef( bFormsContainer ? m_xForms : 
m_xReports );
+    Reference< XNameAccess > xContainer = rContainerRef;
+       if ( !xContainer.is() )
+       {
+               if ( !m_pImpl->m_aContainer[ _eType ].get() )
+               {
+                       m_pImpl->m_aContainer[ _eType ] = TContentPtr( new 
ODefinitionContainer_Impl );
+                       m_pImpl->m_aContainer[ _eType ]->m_pDataSource = 
m_pImpl.get();
+                       m_pImpl->m_aContainer[ _eType ]->m_aProps.aTitle = 
::rtl::OUString::createFromAscii( bFormsContainer ? "forms" : "reports" );
+               }
+        rContainerRef = xContainer = new ODocumentContainer( 
m_pImpl->m_xServiceFactory, *this, m_pImpl->m_aContainer[ _eType ], 
bFormsContainer );
+        impl_reparent_nothrow( xContainer );
+       }
+       return xContainer;
+}
+// 
-----------------------------------------------------------------------------
 void ODatabaseDocument::impl_closeControllerFrames( sal_Bool 
_bDeliverOwnership )
 {
     ::std::vector< Reference< XController> > aCopy = m_pImpl->m_aControllers;
@@ -735,44 +774,12 @@
 // 
-----------------------------------------------------------------------------
 Reference< XNameAccess > SAL_CALL ODatabaseDocument::getFormDocuments(  ) 
throw (RuntimeException)
 {
-    ModelMethodGuard aGuard( *this );
-    OSL_ENSURE(m_pImpl.is(),"Impl is NULL");
-
-       Reference< XNameAccess > xContainer = m_pImpl->m_xForms;
-       if ( !xContainer.is() )
-       {
-               if ( !m_pImpl->m_aContainer[ODatabaseModelImpl::E_FORM].get() )
-               {
-                       ::rtl::OUString 
sName(RTL_CONSTASCII_USTRINGPARAM("forms"));
-                       m_pImpl->m_aContainer[ODatabaseModelImpl::E_FORM] = 
TContentPtr(new ODefinitionContainer_Impl);
-                       
m_pImpl->m_aContainer[ODatabaseModelImpl::E_FORM]->m_pDataSource = 
m_pImpl.get();
-                       
m_pImpl->m_aContainer[ODatabaseModelImpl::E_FORM]->m_aProps.aTitle = sName;
-               }
-               xContainer = new 
ODocumentContainer(m_pImpl->m_xServiceFactory,*this,m_pImpl->m_aContainer[ODatabaseModelImpl::E_FORM],sal_True);
-               m_pImpl->m_xForms = xContainer;
-       }
-       return xContainer;
+    return impl_getDocumentContainer_throw( ODatabaseModelImpl::E_FORM );
 }
 // 
-----------------------------------------------------------------------------
 Reference< XNameAccess > SAL_CALL ODatabaseDocument::getReportDocuments(  ) 
throw (RuntimeException)
 {
-    ModelMethodGuard aGuard( *this );
-    OSL_ENSURE(m_pImpl.is(),"Impl is NULL");
-
-       Reference< XNameAccess > xContainer = m_pImpl->m_xReports;
-       if ( !xContainer.is() )
-       {
-               if ( !m_pImpl->m_aContainer[ODatabaseModelImpl::E_REPORT].get() 
)
-               {
-                       m_pImpl->m_aContainer[ODatabaseModelImpl::E_REPORT] = 
TContentPtr(new ODefinitionContainer_Impl);
-                       ::rtl::OUString 
sName(RTL_CONSTASCII_USTRINGPARAM("reports"));
-                       
m_pImpl->m_aContainer[ODatabaseModelImpl::E_REPORT]->m_pDataSource = 
m_pImpl.get();
-                       
m_pImpl->m_aContainer[ODatabaseModelImpl::E_REPORT]->m_aProps.aTitle = sName;
-               }
-               xContainer = new 
ODocumentContainer(m_pImpl->m_xServiceFactory,*this,m_pImpl->m_aContainer[ODatabaseModelImpl::E_REPORT],sal_False);
-               m_pImpl->m_xReports = xContainer;
-       }
-       return xContainer;
+    return impl_getDocumentContainer_throw( ODatabaseModelImpl::E_REPORT );
 }
 // 
-----------------------------------------------------------------------------
 sal_Bool ODatabaseDocument::WriteThroughComponent(
@@ -1069,19 +1076,10 @@
         m_xDocEventBroadcaster = NULL;
         m_xUIConfigurationManager = NULL;
 
-               Reference<XChild> xChild(m_pImpl->m_xForms.get(),UNO_QUERY);
-               if ( xChild.is() )
-                       xChild->setParent(NULL);
-
-               xChild.set(m_pImpl->m_xReports.get(),UNO_QUERY);
-               if ( xChild.is() )
-                       xChild->setParent(NULL);
-               xChild.set(m_pImpl->m_xTableDefinitions.get(),UNO_QUERY);
-               if ( xChild.is() )
-                       xChild->setParent(NULL);
-               xChild.set(m_pImpl->m_xCommandDefinitions.get(),UNO_QUERY);
-               if ( xChild.is() )
-                       xChild->setParent(NULL);
+        impl_clearObjectContainer( m_xForms, true );
+               impl_clearObjectContainer( m_xReports, true );
+               impl_clearObjectContainer( m_pImpl->m_xTableDefinitions, true );
+               impl_clearObjectContainer( m_pImpl->m_xCommandDefinitions, true 
);
 
         m_pImpl->modelIsDisposing( ODatabaseModelImpl::ResetModelAccess() );
     }




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to