196de5490SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 396de5490SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 496de5490SAndrew Rist * or more contributor license agreements. See the NOTICE file 596de5490SAndrew Rist * distributed with this work for additional information 696de5490SAndrew Rist * regarding copyright ownership. The ASF licenses this file 796de5490SAndrew Rist * to you under the Apache License, Version 2.0 (the 896de5490SAndrew Rist * "License"); you may not use this file except in compliance 996de5490SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 1196de5490SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 1396de5490SAndrew Rist * Unless required by applicable law or agreed to in writing, 1496de5490SAndrew Rist * software distributed under the License is distributed on an 1596de5490SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 1696de5490SAndrew Rist * KIND, either express or implied. See the License for the 1796de5490SAndrew Rist * specific language governing permissions and limitations 1896de5490SAndrew Rist * under the License. 19cdf0e10cSrcweir * 2096de5490SAndrew Rist *************************************************************/ 2196de5490SAndrew Rist 2296de5490SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25*b63233d8Sdamjan #include "precompiled_dbui.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #ifndef _DBAUI_ODBC_CONFIG_HXX_ 28cdf0e10cSrcweir #include "odbcconfig.hxx" 29cdf0e10cSrcweir #endif 30cdf0e10cSrcweir #include <rtl/bootstrap.hxx> 31cdf0e10cSrcweir #ifndef _RTL_USTRING_HXX_ 32cdf0e10cSrcweir #include <rtl/ustring.hxx> 33cdf0e10cSrcweir #endif 34cdf0e10cSrcweir #ifndef _RTL_USTRBUF_HXX_ 35cdf0e10cSrcweir #include <rtl/ustrbuf.hxx> 36cdf0e10cSrcweir #endif 37cdf0e10cSrcweir #ifndef _OSL_DIAGNOSE_H_ 38cdf0e10cSrcweir #include <osl/diagnose.h> 39cdf0e10cSrcweir #endif 40cdf0e10cSrcweir #ifndef _OSL_PROCESS_H_ 41cdf0e10cSrcweir #include <osl/process.h> 42cdf0e10cSrcweir #endif 43cdf0e10cSrcweir #ifndef _THREAD_HXX_ 44cdf0e10cSrcweir #include <osl/thread.hxx> 45cdf0e10cSrcweir #endif 46cdf0e10cSrcweir #ifndef _TOOLS_DEBUG_HXX 47cdf0e10cSrcweir #include <tools/debug.hxx> 48cdf0e10cSrcweir #endif 49cdf0e10cSrcweir #ifndef _SV_SVAPP_HXX 50cdf0e10cSrcweir #include <vcl/svapp.hxx> 51cdf0e10cSrcweir #endif 52cdf0e10cSrcweir 53cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT 54cdf0e10cSrcweir 55cdf0e10cSrcweir #if defined(OS2) 56cdf0e10cSrcweir #define ODBC_LIBRARY "ODBC.DLL" 57cdf0e10cSrcweir #define ODBC_UI_LIBRARY "ODBCINST.DLL" 58cdf0e10cSrcweir #endif 59cdf0e10cSrcweir #if defined WNT 60cdf0e10cSrcweir #define ODBC_LIBRARY "ODBC32.DLL" 61cdf0e10cSrcweir #define ODBC_UI_LIBRARY "ODBCCP32.DLL" 62cdf0e10cSrcweir #endif 63cdf0e10cSrcweir #ifdef UNX 64cdf0e10cSrcweir #ifdef MACOSX 65cdf0e10cSrcweir #define ODBC_LIBRARY "libiodbc.dylib" 66cdf0e10cSrcweir #define ODBC_UI_LIBRARY "libiodbcinst.dylib" 67cdf0e10cSrcweir #else 68cdf0e10cSrcweir #define ODBC_LIBRARY_1 "libodbc.so.1" 69cdf0e10cSrcweir #define ODBC_UI_LIBRARY_1 "libodbcinst.so.1" 70cdf0e10cSrcweir #define ODBC_LIBRARY "libodbc.so" 71cdf0e10cSrcweir #define ODBC_UI_LIBRARY "libodbcinst.so" 72cdf0e10cSrcweir #endif 73cdf0e10cSrcweir #endif 74cdf0e10cSrcweir 75cdf0e10cSrcweir // just to go with calling convention of windows 76cdf0e10cSrcweir // so don't touch this 77cdf0e10cSrcweir #if defined(WNT) 78cdf0e10cSrcweir #define SQL_API __stdcall 79cdf0e10cSrcweir // At least under some circumstances, the below #include <odbc/sqlext.h> re- 80cdf0e10cSrcweir // defines SQL_API to an empty string, leading to a compiler warning on MSC; to 81cdf0e10cSrcweir // not break the current behavior, this is worked around by locally disabling 82cdf0e10cSrcweir // that warning: 83cdf0e10cSrcweir #if defined _MSC_VER 84cdf0e10cSrcweir #pragma warning(push) 85cdf0e10cSrcweir #pragma warning(disable: 4005) 86cdf0e10cSrcweir #endif 87cdf0e10cSrcweir #endif // defined(WNT) 88cdf0e10cSrcweir 89cdf0e10cSrcweir #if defined(OS2) 90cdf0e10cSrcweir #define ALLREADY_HAVE_OS2_TYPES 91cdf0e10cSrcweir #define DONT_TD_VOID 92cdf0e10cSrcweir #endif 93cdf0e10cSrcweir 94cdf0e10cSrcweir #ifdef SYSTEM_ODBC_HEADERS 95cdf0e10cSrcweir #include <sqlext.h> 96cdf0e10cSrcweir #else 97cdf0e10cSrcweir #ifndef __SQLEXT_H 98cdf0e10cSrcweir #include <odbc/sqlext.h> 99cdf0e10cSrcweir #endif 100cdf0e10cSrcweir #endif 101cdf0e10cSrcweir 102cdf0e10cSrcweir #if defined(WNT) 103cdf0e10cSrcweir #if defined _MSC_VER 104cdf0e10cSrcweir #pragma warning(pop) 105cdf0e10cSrcweir #endif 106cdf0e10cSrcweir #undef SQL_API 107cdf0e10cSrcweir #define SQL_API __stdcall 108cdf0e10cSrcweir #endif // defined(WNT) 109cdf0e10cSrcweir // from here on you can do what you want to 110cdf0e10cSrcweir 111cdf0e10cSrcweir #else 112cdf0e10cSrcweir 113cdf0e10cSrcweir #define ODBC_LIBRARY "" 114cdf0e10cSrcweir #define ODBC_UI_LIBRARY "" 115cdf0e10cSrcweir 116cdf0e10cSrcweir #endif // HAVE_ODBC_SUPPORT 117cdf0e10cSrcweir 118cdf0e10cSrcweir //......................................................................... 119cdf0e10cSrcweir namespace dbaui 120cdf0e10cSrcweir { 121cdf0e10cSrcweir //......................................................................... 122cdf0e10cSrcweir 123cdf0e10cSrcweir 124cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT 125cdf0e10cSrcweir typedef SQLRETURN (SQL_API* TSQLManageDataSource) (SQLHWND hwndParent); 126cdf0e10cSrcweir typedef SQLRETURN (SQL_API* TSQLAllocHandle) (SQLSMALLINT HandleType, SQLHANDLE InputHandle, SQLHANDLE* OutputHandlePtr); 127cdf0e10cSrcweir typedef SQLRETURN (SQL_API* TSQLFreeHandle) (SQLSMALLINT HandleType, SQLHANDLE Handle); 128cdf0e10cSrcweir typedef SQLRETURN (SQL_API* TSQLSetEnvAttr) (SQLHENV EnvironmentHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER StringLength); 129cdf0e10cSrcweir typedef SQLRETURN (SQL_API* TSQLDataSources) (SQLHENV EnvironmentHandle, SQLUSMALLINT Direction, SQLCHAR* ServerName, 130cdf0e10cSrcweir SQLSMALLINT BufferLength1, SQLSMALLINT* NameLength1Ptr, SQLCHAR* Description, SQLSMALLINT BufferLength2, SQLSMALLINT* NameLength2Ptr); 131cdf0e10cSrcweir 132cdf0e10cSrcweir #define NSQLManageDataSource(a) (*(TSQLManageDataSource)(m_pSQLManageDataSource))(a) 133cdf0e10cSrcweir #define NSQLAllocHandle(a,b,c) (*(TSQLAllocHandle)(m_pAllocHandle))(a,b,c) 134cdf0e10cSrcweir #define NSQLFreeHandle(a,b) (*(TSQLFreeHandle)(m_pFreeHandle))(a,b) 135cdf0e10cSrcweir #define NSQLSetEnvAttr(a,b,c,d) (*(TSQLSetEnvAttr)(m_pSetEnvAttr))(a,b,c,d) 136cdf0e10cSrcweir #define NSQLDataSources(a,b,c,d,e,f,g,h) (*(TSQLDataSources)(m_pDataSources))(a,b,c,d,e,f,g,h) 137cdf0e10cSrcweir #endif 138cdf0e10cSrcweir 139cdf0e10cSrcweir //========================================================================= 140cdf0e10cSrcweir //= OOdbcLibWrapper 141cdf0e10cSrcweir //========================================================================= 142cdf0e10cSrcweir DBG_NAME(OOdbcLibWrapper) 143cdf0e10cSrcweir //------------------------------------------------------------------------- 144cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT 145cdf0e10cSrcweir OOdbcLibWrapper::OOdbcLibWrapper() 146cdf0e10cSrcweir :m_pOdbcLib(NULL) 147cdf0e10cSrcweir { 148cdf0e10cSrcweir DBG_CTOR(OOdbcLibWrapper,NULL); 149cdf0e10cSrcweir 150cdf0e10cSrcweir } 151cdf0e10cSrcweir #endif 152cdf0e10cSrcweir 153cdf0e10cSrcweir //------------------------------------------------------------------------- 154cdf0e10cSrcweir sal_Bool OOdbcLibWrapper::load(const sal_Char* _pLibPath) 155cdf0e10cSrcweir { 156cdf0e10cSrcweir m_sLibPath = ::rtl::OUString::createFromAscii(_pLibPath); 157cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT 158cdf0e10cSrcweir // load the module 159cdf0e10cSrcweir m_pOdbcLib = osl_loadModule(m_sLibPath.pData, SAL_LOADMODULE_NOW); 160cdf0e10cSrcweir return (NULL != m_pOdbcLib); 161cdf0e10cSrcweir #endif 162cdf0e10cSrcweir } 163cdf0e10cSrcweir 164cdf0e10cSrcweir //------------------------------------------------------------------------- 165cdf0e10cSrcweir void OOdbcLibWrapper::unload() 166cdf0e10cSrcweir { 167cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT 168cdf0e10cSrcweir if (isLoaded()) 169cdf0e10cSrcweir { 170cdf0e10cSrcweir osl_unloadModule(m_pOdbcLib); 171cdf0e10cSrcweir m_pOdbcLib = NULL; 172cdf0e10cSrcweir } 173cdf0e10cSrcweir #endif 174cdf0e10cSrcweir } 175cdf0e10cSrcweir 176cdf0e10cSrcweir //------------------------------------------------------------------------- 177cdf0e10cSrcweir oslGenericFunction OOdbcLibWrapper::loadSymbol(const sal_Char* _pFunctionName) 178cdf0e10cSrcweir { 179cdf0e10cSrcweir return osl_getFunctionSymbol(m_pOdbcLib, ::rtl::OUString::createFromAscii(_pFunctionName).pData); 180cdf0e10cSrcweir } 181cdf0e10cSrcweir 182cdf0e10cSrcweir //------------------------------------------------------------------------- 183cdf0e10cSrcweir OOdbcLibWrapper::~OOdbcLibWrapper() 184cdf0e10cSrcweir { 185cdf0e10cSrcweir unload(); 186cdf0e10cSrcweir 187cdf0e10cSrcweir DBG_DTOR(OOdbcLibWrapper,NULL); 188cdf0e10cSrcweir } 189cdf0e10cSrcweir 190cdf0e10cSrcweir //========================================================================= 191cdf0e10cSrcweir //= OOdbcEnumeration 192cdf0e10cSrcweir //========================================================================= 193cdf0e10cSrcweir struct OdbcTypesImpl 194cdf0e10cSrcweir { 195cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT 196cdf0e10cSrcweir SQLHANDLE hEnvironment; 197cdf0e10cSrcweir OdbcTypesImpl() : hEnvironment(0) { } 198cdf0e10cSrcweir #else 199cdf0e10cSrcweir void* pDummy; 200cdf0e10cSrcweir #endif 201cdf0e10cSrcweir }; 202cdf0e10cSrcweir DBG_NAME(OOdbcEnumeration) 203cdf0e10cSrcweir //------------------------------------------------------------------------- 204cdf0e10cSrcweir OOdbcEnumeration::OOdbcEnumeration() 205cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT 206cdf0e10cSrcweir :m_pAllocHandle(NULL) 207cdf0e10cSrcweir ,m_pSetEnvAttr(NULL) 208cdf0e10cSrcweir ,m_pDataSources(NULL) 209cdf0e10cSrcweir ,m_pImpl(new OdbcTypesImpl) 210cdf0e10cSrcweir #endif 211cdf0e10cSrcweir { 212cdf0e10cSrcweir DBG_CTOR(OOdbcEnumeration,NULL); 213cdf0e10cSrcweir 214cdf0e10cSrcweir sal_Bool bLoaded = load(ODBC_LIBRARY); 215cdf0e10cSrcweir #ifdef ODBC_LIBRARY_1 216cdf0e10cSrcweir if ( !bLoaded ) 217cdf0e10cSrcweir bLoaded = load(ODBC_LIBRARY_1); 218cdf0e10cSrcweir #endif 219cdf0e10cSrcweir 220cdf0e10cSrcweir if ( bLoaded ) 221cdf0e10cSrcweir { 222cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT 223cdf0e10cSrcweir // load the generic functions 224cdf0e10cSrcweir m_pAllocHandle = loadSymbol("SQLAllocHandle"); 225cdf0e10cSrcweir m_pFreeHandle = loadSymbol("SQLFreeHandle"); 226cdf0e10cSrcweir m_pSetEnvAttr = loadSymbol("SQLSetEnvAttr"); 227cdf0e10cSrcweir m_pDataSources = loadSymbol("SQLDataSources"); 228cdf0e10cSrcweir 229cdf0e10cSrcweir // all or nothing 230cdf0e10cSrcweir if (!m_pAllocHandle || !m_pSetEnvAttr || !m_pDataSources || !m_pFreeHandle) 231cdf0e10cSrcweir { 232cdf0e10cSrcweir unload(); 233cdf0e10cSrcweir m_pAllocHandle = m_pFreeHandle = m_pSetEnvAttr = m_pDataSources = NULL; 234cdf0e10cSrcweir } 235cdf0e10cSrcweir #endif 236cdf0e10cSrcweir } 237cdf0e10cSrcweir } 238cdf0e10cSrcweir 239cdf0e10cSrcweir //------------------------------------------------------------------------- 240cdf0e10cSrcweir OOdbcEnumeration::~OOdbcEnumeration() 241cdf0e10cSrcweir { 242cdf0e10cSrcweir freeEnv(); 243cdf0e10cSrcweir delete m_pImpl; 244cdf0e10cSrcweir 245cdf0e10cSrcweir DBG_DTOR(OOdbcEnumeration,NULL); 246cdf0e10cSrcweir } 247cdf0e10cSrcweir 248cdf0e10cSrcweir //------------------------------------------------------------------------- 249cdf0e10cSrcweir sal_Bool OOdbcEnumeration::allocEnv() 250cdf0e10cSrcweir { 251cdf0e10cSrcweir OSL_ENSURE(isLoaded(), "OOdbcEnumeration::allocEnv: not loaded!"); 252cdf0e10cSrcweir if (!isLoaded()) 253cdf0e10cSrcweir return sal_False; 254cdf0e10cSrcweir 255cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT 256cdf0e10cSrcweir if (m_pImpl->hEnvironment) 257cdf0e10cSrcweir // nothing to do 258cdf0e10cSrcweir return sal_True; 259cdf0e10cSrcweir SQLRETURN nResult = NSQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &m_pImpl->hEnvironment); 260cdf0e10cSrcweir if (SQL_SUCCESS != nResult) 261cdf0e10cSrcweir // can't do anything without environment 262cdf0e10cSrcweir return sal_False; 263cdf0e10cSrcweir 264cdf0e10cSrcweir NSQLSetEnvAttr(m_pImpl->hEnvironment, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER); 265cdf0e10cSrcweir return sal_True; 266cdf0e10cSrcweir #else 267cdf0e10cSrcweir return sal_False; 268cdf0e10cSrcweir #endif 269cdf0e10cSrcweir } 270cdf0e10cSrcweir 271cdf0e10cSrcweir //------------------------------------------------------------------------- 272cdf0e10cSrcweir void OOdbcEnumeration::freeEnv() 273cdf0e10cSrcweir { 274cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT 275cdf0e10cSrcweir if (m_pImpl->hEnvironment) 276cdf0e10cSrcweir NSQLFreeHandle(SQL_HANDLE_ENV, m_pImpl->hEnvironment); 277cdf0e10cSrcweir m_pImpl->hEnvironment = 0; 278cdf0e10cSrcweir #endif 279cdf0e10cSrcweir } 280cdf0e10cSrcweir 281cdf0e10cSrcweir //------------------------------------------------------------------------- 282cdf0e10cSrcweir void OOdbcEnumeration::getDatasourceNames(StringBag& _rNames) 283cdf0e10cSrcweir { 284cdf0e10cSrcweir OSL_ENSURE(isLoaded(), "OOdbcEnumeration::getDatasourceNames: not loaded!"); 285cdf0e10cSrcweir if (!isLoaded()) 286cdf0e10cSrcweir return; 287cdf0e10cSrcweir 288cdf0e10cSrcweir if (!allocEnv()) 289cdf0e10cSrcweir { 290cdf0e10cSrcweir OSL_ENSURE(sal_False, "OOdbcEnumeration::getDatasourceNames: could not allocate an ODBC environment!"); 291cdf0e10cSrcweir return; 292cdf0e10cSrcweir } 293cdf0e10cSrcweir 294cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT 295cdf0e10cSrcweir // now that we have an environment collect the data source names 296cdf0e10cSrcweir UCHAR szDSN[SQL_MAX_DSN_LENGTH+1]; 297cdf0e10cSrcweir SWORD pcbDSN; 298cdf0e10cSrcweir UCHAR szDescription[1024+1]; 299cdf0e10cSrcweir SWORD pcbDescription; 300cdf0e10cSrcweir SQLRETURN nResult = SQL_SUCCESS; 301cdf0e10cSrcweir rtl_TextEncoding nTextEncoding = osl_getThreadTextEncoding(); 302cdf0e10cSrcweir 303cdf0e10cSrcweir for ( nResult = NSQLDataSources(m_pImpl->hEnvironment, SQL_FETCH_FIRST, szDSN, sizeof(szDSN), &pcbDSN, szDescription, sizeof(szDescription)-1, &pcbDescription); 304cdf0e10cSrcweir ; 305cdf0e10cSrcweir nResult = NSQLDataSources(m_pImpl->hEnvironment, SQL_FETCH_NEXT, szDSN, sizeof(szDSN), &pcbDSN, szDescription, sizeof(szDescription)-1, &pcbDescription) 306cdf0e10cSrcweir ) 307cdf0e10cSrcweir { 308cdf0e10cSrcweir if (nResult != SQL_SUCCESS) 309cdf0e10cSrcweir // no further error handling 310cdf0e10cSrcweir break; 311cdf0e10cSrcweir else 312cdf0e10cSrcweir { 313cdf0e10cSrcweir ::rtl::OUString aCurrentDsn(reinterpret_cast<const char*>(szDSN),pcbDSN, nTextEncoding); 314cdf0e10cSrcweir _rNames.insert(aCurrentDsn); 315cdf0e10cSrcweir } 316cdf0e10cSrcweir } 317cdf0e10cSrcweir #endif 318cdf0e10cSrcweir } 319cdf0e10cSrcweir 320cdf0e10cSrcweir #ifdef HAVE_ODBC_ADMINISTRATION 321cdf0e10cSrcweir 322cdf0e10cSrcweir //========================================================================= 323cdf0e10cSrcweir //= ProcessTerminationWait 324cdf0e10cSrcweir //========================================================================= 325cdf0e10cSrcweir class ProcessTerminationWait : public ::osl::Thread 326cdf0e10cSrcweir { 327cdf0e10cSrcweir oslProcess m_hProcessHandle; 328cdf0e10cSrcweir Link m_aFinishHdl; 329cdf0e10cSrcweir 330cdf0e10cSrcweir public: 331cdf0e10cSrcweir ProcessTerminationWait( oslProcess _hProcessHandle, const Link& _rFinishHdl ) 332cdf0e10cSrcweir :m_hProcessHandle( _hProcessHandle ) 333cdf0e10cSrcweir ,m_aFinishHdl( _rFinishHdl ) 334cdf0e10cSrcweir { 335cdf0e10cSrcweir } 336cdf0e10cSrcweir 337cdf0e10cSrcweir protected: 338cdf0e10cSrcweir virtual void SAL_CALL run() 339cdf0e10cSrcweir { 340cdf0e10cSrcweir osl_joinProcess( m_hProcessHandle ); 341cdf0e10cSrcweir osl_freeProcessHandle( m_hProcessHandle ); 342cdf0e10cSrcweir Application::PostUserEvent( m_aFinishHdl ); 343cdf0e10cSrcweir } 344cdf0e10cSrcweir }; 345cdf0e10cSrcweir 346cdf0e10cSrcweir //========================================================================= 347cdf0e10cSrcweir //= OOdbcManagement 348cdf0e10cSrcweir //========================================================================= 349cdf0e10cSrcweir //------------------------------------------------------------------------- 350cdf0e10cSrcweir OOdbcManagement::OOdbcManagement( const Link& _rAsyncFinishCallback ) 351cdf0e10cSrcweir :m_pProcessWait( NULL ) 352cdf0e10cSrcweir ,m_aAsyncFinishCallback( _rAsyncFinishCallback ) 353cdf0e10cSrcweir { 354cdf0e10cSrcweir } 355cdf0e10cSrcweir 356cdf0e10cSrcweir //------------------------------------------------------------------------- 357cdf0e10cSrcweir OOdbcManagement::~OOdbcManagement() 358cdf0e10cSrcweir { 359cdf0e10cSrcweir // wait for our thread to be finished 360cdf0e10cSrcweir if ( m_pProcessWait.get() ) 361cdf0e10cSrcweir m_pProcessWait->join(); 362cdf0e10cSrcweir } 363cdf0e10cSrcweir 364cdf0e10cSrcweir //------------------------------------------------------------------------- 365cdf0e10cSrcweir bool OOdbcManagement::manageDataSources_async() 366cdf0e10cSrcweir { 367cdf0e10cSrcweir OSL_PRECOND( !isRunning(), "OOdbcManagement::manageDataSources_async: still running from the previous call!" ); 368cdf0e10cSrcweir if ( isRunning() ) 369cdf0e10cSrcweir return false; 370cdf0e10cSrcweir 371cdf0e10cSrcweir // this is done in an external process, due to #i78733# 372cdf0e10cSrcweir // (and note this whole functionality is supported on Windows only, ATM) 373cdf0e10cSrcweir ::rtl::OUString sExecutableName( RTL_CONSTASCII_USTRINGPARAM( "$OOO_BASE_DIR/program/odbcconfig.exe" ) ); 374cdf0e10cSrcweir ::rtl::Bootstrap::expandMacros( sExecutableName ); //TODO: detect failure 375cdf0e10cSrcweir oslProcess hProcessHandle(0); 376cdf0e10cSrcweir oslProcessError eError = osl_executeProcess( sExecutableName.pData, NULL, 0, 0, NULL, NULL, NULL, 0, &hProcessHandle ); 377cdf0e10cSrcweir if ( eError != osl_Process_E_None ) 378cdf0e10cSrcweir return false; 379cdf0e10cSrcweir 380cdf0e10cSrcweir m_pProcessWait.reset( new ProcessTerminationWait( hProcessHandle, m_aAsyncFinishCallback ) ); 381cdf0e10cSrcweir m_pProcessWait->create(); 382cdf0e10cSrcweir return true; 383cdf0e10cSrcweir } 384cdf0e10cSrcweir 385cdf0e10cSrcweir //------------------------------------------------------------------------- 386cdf0e10cSrcweir bool OOdbcManagement::isRunning() const 387cdf0e10cSrcweir { 388cdf0e10cSrcweir return ( m_pProcessWait.get() && m_pProcessWait->isRunning() ); 389cdf0e10cSrcweir } 390cdf0e10cSrcweir 391cdf0e10cSrcweir #endif // HAVE_ODBC_ADMINISTRATION 392cdf0e10cSrcweir 393cdf0e10cSrcweir //......................................................................... 394cdf0e10cSrcweir } // namespace dbaui 395cdf0e10cSrcweir //......................................................................... 396