User: rt      
Date: 2007-07-24 12:08:49+0000
Modified:
   dba/dbaccess/source/ui/dlg/odbcconfig.cxx

Log:
 INTEGRATION: CWS dba23b (1.17.88); FILE MERGED
 2007/07/04 11:57:16 fs 1.17.88.2: #i10000#
 2007/07/04 10:33:35 fs 1.17.88.1: #i78733# managing data sources now done by 
an external process

File Changes:

Directory: /dba/dbaccess/source/ui/dlg/
=======================================

File [changed]: odbcconfig.cxx
Url: 
http://dba.openoffice.org/source/browse/dba/dbaccess/source/ui/dlg/odbcconfig.cxx?r1=1.18&r2=1.19
Delta lines:  +70 -27
---------------------
--- odbcconfig.cxx      2007-07-06 08:18:35+0000        1.18
+++ odbcconfig.cxx      2007-07-24 12:08:47+0000        1.19
@@ -48,9 +48,18 @@
 #ifndef _OSL_DIAGNOSE_H_
 #include <osl/diagnose.h>
 #endif
+#ifndef _OSL_PROCESS_H_
+#include <osl/process.h>
+#endif
+#ifndef _THREAD_HXX_
+#include <osl/thread.hxx>
+#endif
 #ifndef _TOOLS_DEBUG_HXX
 #include <tools/debug.hxx>
 #endif
+#ifndef _SV_SVAPP_HXX
+#include <vcl/svapp.hxx>
+#endif
 
 #ifdef HAVE_ODBC_SUPPORT
 
@@ -277,13 +286,13 @@
 //-------------------------------------------------------------------------
 void OOdbcEnumeration::getDatasourceNames(StringBag& _rNames)
 {
-       OSL_ENSURE(isLoaded(), "OOdbcManagement::getDatasourceNames: not 
loaded!");
+       OSL_ENSURE(isLoaded(), "OOdbcEnumeration::getDatasourceNames: not 
loaded!");
        if (!isLoaded())
                return;
 
        if (!allocEnv())
        {
-               OSL_ENSURE(sal_False, "OOdbcManagement::getDatasourceNames: 
could not allocate an ODBC environment!");
+               OSL_ENSURE(sal_False, "OOdbcEnumeration::getDatasourceNames: 
could not allocate an ODBC environment!");
                return;
        }
 
@@ -312,43 +321,77 @@
 #endif
 }
 
+#ifdef HAVE_ODBC_ADMINISTRATION
+
 //=========================================================================
-//= OOdbcManagement
+//= ProcessTerminationWait
 //=========================================================================
-//-------------------------------------------------------------------------
-OOdbcManagement::OOdbcManagement()
-#ifdef HAVE_ODBC_SUPPORT
-:m_pSQLManageDataSource(NULL)
-#endif
+class ProcessTerminationWait : public ::osl::Thread
 {
-       sal_Bool bLoaded = load(ODBC_UI_LIBRARY);
-#ifdef ODBC_UI_LIBRARY_1
-       if ( !bLoaded )
-               bLoaded = load(ODBC_UI_LIBRARY_1);
-#endif
-       if ( bLoaded )
+    oslProcess  m_hProcessHandle;
+    Link        m_aFinishHdl;
+
+public:
+    ProcessTerminationWait( oslProcess _hProcessHandle, const Link& 
_rFinishHdl )
+        :m_hProcessHandle( _hProcessHandle )
+        ,m_aFinishHdl( _rFinishHdl )
        {
-#ifdef HAVE_ODBC_SUPPORT
-               m_pSQLManageDataSource = loadSymbol("SQLManageDataSources");
-               if (!m_pSQLManageDataSource)
-                       unload();
-#endif // HAVE_ODBC_SUPPORT
        }
+
+protected:
+    virtual void SAL_CALL run()
+    {
+        osl_joinProcess( m_hProcessHandle );
+        Application::PostUserEvent( m_aFinishHdl );
+    }
+};
+
+//=========================================================================
+//= OOdbcManagement
+//=========================================================================
+//-------------------------------------------------------------------------
+OOdbcManagement::OOdbcManagement( const Link& _rAsyncFinishCallback )
+    :m_pProcessWait( NULL )
+    ,m_aAsyncFinishCallback( _rAsyncFinishCallback )
+{
 }
 
 //-------------------------------------------------------------------------
-void OOdbcManagement::manageDataSources(void* _pParentSysWindowHandle)
+OOdbcManagement::~OOdbcManagement()
 {
-       OSL_ENSURE(isLoaded(), "OOdbcManagement::manageDataSources: not 
loaded!");
-       OSL_ENSURE(_pParentSysWindowHandle, 
"OOdbcManagement::manageDataSources: invalid parent window!");
-       if (!isLoaded())
-               return;
+    // wait for our thread to be finished
+    if ( m_pProcessWait.get() )
+        m_pProcessWait->join();
+}
 
-#ifdef HAVE_ODBC_SUPPORT
-       NSQLManageDataSource(_pParentSysWindowHandle);
-#endif // HAVE_ODBC_SUPPORT
+//-------------------------------------------------------------------------
+bool OOdbcManagement::manageDataSources_async()
+{
+    OSL_PRECOND( !isRunning(), "OOdbcManagement::manageDataSources_async: 
still running from the previous call!" );
+    if ( isRunning() )
+        return false;
+
+    // this is done in an external process, due to #i78733#
+    // (and note this whole functionality is supported on Windows only, ATM)
+    ::rtl::OUString sExecutableName( RTL_CONSTASCII_USTRINGPARAM( 
"odbcconfig.exe" ) );
+    oslProcess hProcessHandle(0);
+    oslProcessError eError = osl_executeProcess( sExecutableName.pData, NULL, 
0, 0, NULL, NULL, NULL, 0, &hProcessHandle );
+    if ( eError != osl_Process_E_None )
+        return false;
+
+    m_pProcessWait.reset( new ProcessTerminationWait( hProcessHandle, 
m_aAsyncFinishCallback ) );
+    m_pProcessWait->create();
+    return true;
 }
 
+//-------------------------------------------------------------------------
+bool OOdbcManagement::isRunning() const
+{
+    return ( m_pProcessWait.get() && m_pProcessWait->isRunning() );
+}
+
+#endif // HAVE_ODBC_ADMINISTRATION
+
 //.........................................................................
 }      // namespace dbaui
 //.........................................................................




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

Reply via email to