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]
