Author: arielch
Date: Mon Feb  4 17:54:16 2013
New Revision: 1442201

URL: http://svn.apache.org/viewvc?rev=1442201&view=rev
Log:
Ensure UNO context propagation on drivers instantiation

Use a better approach than revision 1387711

Modified:
    openoffice/trunk/main/connectivity/source/manager/mdrivermanager.cxx
    openoffice/trunk/main/connectivity/source/manager/mdrivermanager.hxx

Modified: openoffice/trunk/main/connectivity/source/manager/mdrivermanager.cxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/connectivity/source/manager/mdrivermanager.cxx?rev=1442201&r1=1442200&r2=1442201&view=diff
==============================================================================
--- openoffice/trunk/main/connectivity/source/manager/mdrivermanager.cxx 
(original)
+++ openoffice/trunk/main/connectivity/source/manager/mdrivermanager.cxx Mon 
Feb  4 17:54:16 2013
@@ -119,6 +119,9 @@ Any SAL_CALL ODriverEnumeration::nextEle
        /// an STL functor which ensures that a SdbcDriver described by a 
DriverAccess is loaded
        struct EnsureDriver : public ::std::unary_function< DriverAccess, 
DriverAccess >
        {
+        EnsureDriver( const Reference< XComponentContext > &rxContext )
+            : mxContext( rxContext ) {}
+
                const DriverAccess& operator()( const DriverAccess& 
_rDescriptor ) const
                {
                        if ( !_rDescriptor.xDriver.is() )
@@ -126,9 +129,12 @@ Any SAL_CALL ODriverEnumeration::nextEle
                                if ( _rDescriptor.xComponentFactory.is() )
                                        // we have a factory for it
                                        const_cast< DriverAccess& >( 
_rDescriptor ).xDriver = _rDescriptor.xDriver.query(
-                        
_rDescriptor.xComponentFactory->createInstanceWithContext( 
_rDescriptor.xUNOContext ) );
+                        
_rDescriptor.xComponentFactory->createInstanceWithContext( mxContext ) );
                        return _rDescriptor;
                }
+
+    private:
+        Reference< XComponentContext > mxContext;
        };
 
        //---------------------------------------------------------------------
@@ -150,7 +156,8 @@ Any SAL_CALL ODriverEnumeration::nextEle
        /// an STL functor which loads a driver described by a DriverAccess, 
and extracts the SdbcDriver
        struct ExtractAfterLoad : public ExtractAfterLoad_BASE
        {
-               ExtractAfterLoad() : ExtractAfterLoad_BASE( 
ExtractDriverFromAccess(), EnsureDriver() ) { }
+        ExtractAfterLoad( const Reference< XComponentContext > &rxContext )
+            : ExtractAfterLoad_BASE( ExtractDriverFromAccess(), EnsureDriver( 
rxContext ) ) {}
        };
 
        //---------------------------------------------------------------------
@@ -338,7 +345,6 @@ void OSDBCDriverManager::bootstrapDriver
                                {       // yes -> no need to load the driver 
immediately (load it later when needed)
                                        aDriverDescriptor.sImplementationName = 
xSI->getImplementationName();
                                        aDriverDescriptor.xComponentFactory = 
xFactory;
-                    aDriverDescriptor.xUNOContext = m_aContext.getUNOContext();
                                        bValidDescriptor = sal_True;
 
                     m_aEventLogger.log( LogLevel::CONFIG,
@@ -523,7 +529,7 @@ Reference< XEnumeration > SAL_CALL OSDBC
        ODriverEnumeration::DriverArray aDrivers;
 
        // ensure that all our bootstrapped drivers are insatntiated
-       ::std::for_each( m_aDriversBS.begin(), m_aDriversBS.end(), 
EnsureDriver() );
+       ::std::for_each( m_aDriversBS.begin(), m_aDriversBS.end(), 
EnsureDriver( m_aContext.getUNOContext() ) );
 
        // copy the bootstrapped drivers
        ::std::transform(
@@ -704,13 +710,13 @@ Reference< XDriver > OSDBCDriverManager:
                    aFind = ::std::find_if(
                            m_aDriversBS.begin(),               // begin of 
search range
                            m_aDriversBS.end(),                 // end of 
search range
-                           std::unary_compose< AcceptsURL, ExtractAfterLoad >( 
AcceptsURL( _rURL ), ExtractAfterLoad() )
+                           std::unary_compose< AcceptsURL, ExtractAfterLoad >( 
AcceptsURL( _rURL ), ExtractAfterLoad( m_aContext.getUNOContext() ) )
                                                                                
    // compose two functors: extract the driver from the access, then ask the 
resulting driver for acceptance
                    );
         } // if ( m_aDriversBS.find(sDriverFactoryName ) == m_aDriversBS.end() 
)
         else
         {
-            EnsureDriver aEnsure;
+            EnsureDriver aEnsure( m_aContext.getUNOContext() );
             aEnsure(*aFind);
         }
 

Modified: openoffice/trunk/main/connectivity/source/manager/mdrivermanager.hxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/connectivity/source/manager/mdrivermanager.hxx?rev=1442201&r1=1442200&r2=1442201&view=diff
==============================================================================
--- openoffice/trunk/main/connectivity/source/manager/mdrivermanager.hxx 
(original)
+++ openoffice/trunk/main/connectivity/source/manager/mdrivermanager.hxx Mon 
Feb  4 17:54:16 2013
@@ -50,12 +50,10 @@ namespace drivermanager
        DECLARE_STL_USTRINGACCESS_MAP( SdbcDriver, DriverCollection );
 
        typedef ::com::sun::star::uno::Reference< 
::com::sun::star::lang::XSingleComponentFactory >             DriverFactory;
-    typedef ::com::sun::star::uno::Reference< 
::com::sun::star::uno::XComponentContext >            UNOContext;
        struct DriverAccess
        {
                ::rtl::OUString         sImplementationName;            /// the 
implementation name of the driver
                DriverFactory           xComponentFactory;                      
/// the factory to create the driver component (if not already done so)
-               UNOContext          xUNOContext;                /// ensure UNO 
context propagation
                SdbcDriver                      xDriver;                        
                /// the driver itself
        };
 


Reply via email to