xref: /AOO41X/main/dbaccess/source/ui/dlg/odbcconfig.cxx (revision 96de54900b79e13b861fbc62cbf36018b54e21b7)
1*96de5490SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*96de5490SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*96de5490SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*96de5490SAndrew Rist  * distributed with this work for additional information
6*96de5490SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*96de5490SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*96de5490SAndrew Rist  * "License"); you may not use this file except in compliance
9*96de5490SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*96de5490SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*96de5490SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*96de5490SAndrew Rist  * software distributed under the License is distributed on an
15*96de5490SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*96de5490SAndrew Rist  * KIND, either express or implied.  See the License for the
17*96de5490SAndrew Rist  * specific language governing permissions and limitations
18*96de5490SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*96de5490SAndrew Rist  *************************************************************/
21*96de5490SAndrew Rist 
22*96de5490SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_dbaccess.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 #if defined(OS2)
112cdf0e10cSrcweir #define SQL_API _System
113cdf0e10cSrcweir #endif // defined(OS2)
114cdf0e10cSrcweir 
115cdf0e10cSrcweir #else
116cdf0e10cSrcweir 
117cdf0e10cSrcweir #define ODBC_LIBRARY	""
118cdf0e10cSrcweir #define ODBC_UI_LIBRARY	""
119cdf0e10cSrcweir 
120cdf0e10cSrcweir #endif	// HAVE_ODBC_SUPPORT
121cdf0e10cSrcweir 
122cdf0e10cSrcweir //.........................................................................
123cdf0e10cSrcweir namespace dbaui
124cdf0e10cSrcweir {
125cdf0e10cSrcweir //.........................................................................
126cdf0e10cSrcweir 
127cdf0e10cSrcweir 
128cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT
129cdf0e10cSrcweir typedef SQLRETURN (SQL_API* TSQLManageDataSource) (SQLHWND hwndParent);
130cdf0e10cSrcweir typedef SQLRETURN (SQL_API* TSQLAllocHandle) (SQLSMALLINT HandleType, SQLHANDLE InputHandle, SQLHANDLE*	OutputHandlePtr);
131cdf0e10cSrcweir typedef SQLRETURN (SQL_API* TSQLFreeHandle) (SQLSMALLINT HandleType, SQLHANDLE Handle);
132cdf0e10cSrcweir typedef SQLRETURN (SQL_API* TSQLSetEnvAttr) (SQLHENV EnvironmentHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER StringLength);
133cdf0e10cSrcweir typedef SQLRETURN (SQL_API* TSQLDataSources) (SQLHENV EnvironmentHandle, SQLUSMALLINT	Direction, SQLCHAR* ServerName,
134cdf0e10cSrcweir 								SQLSMALLINT BufferLength1, SQLSMALLINT* NameLength1Ptr, SQLCHAR* Description, SQLSMALLINT BufferLength2, SQLSMALLINT* NameLength2Ptr);
135cdf0e10cSrcweir 
136cdf0e10cSrcweir #define NSQLManageDataSource(a) (*(TSQLManageDataSource)(m_pSQLManageDataSource))(a)
137cdf0e10cSrcweir #define NSQLAllocHandle(a,b,c) (*(TSQLAllocHandle)(m_pAllocHandle))(a,b,c)
138cdf0e10cSrcweir #define NSQLFreeHandle(a,b) (*(TSQLFreeHandle)(m_pFreeHandle))(a,b)
139cdf0e10cSrcweir #define NSQLSetEnvAttr(a,b,c,d) (*(TSQLSetEnvAttr)(m_pSetEnvAttr))(a,b,c,d)
140cdf0e10cSrcweir #define NSQLDataSources(a,b,c,d,e,f,g,h) (*(TSQLDataSources)(m_pDataSources))(a,b,c,d,e,f,g,h)
141cdf0e10cSrcweir #endif
142cdf0e10cSrcweir 
143cdf0e10cSrcweir //=========================================================================
144cdf0e10cSrcweir //= OOdbcLibWrapper
145cdf0e10cSrcweir //=========================================================================
146cdf0e10cSrcweir DBG_NAME(OOdbcLibWrapper)
147cdf0e10cSrcweir //-------------------------------------------------------------------------
148cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT
149cdf0e10cSrcweir OOdbcLibWrapper::OOdbcLibWrapper()
150cdf0e10cSrcweir 	:m_pOdbcLib(NULL)
151cdf0e10cSrcweir {
152cdf0e10cSrcweir     DBG_CTOR(OOdbcLibWrapper,NULL);
153cdf0e10cSrcweir 
154cdf0e10cSrcweir }
155cdf0e10cSrcweir #endif
156cdf0e10cSrcweir 
157cdf0e10cSrcweir //-------------------------------------------------------------------------
158cdf0e10cSrcweir sal_Bool OOdbcLibWrapper::load(const sal_Char* _pLibPath)
159cdf0e10cSrcweir {
160cdf0e10cSrcweir 	m_sLibPath = ::rtl::OUString::createFromAscii(_pLibPath);
161cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT
162cdf0e10cSrcweir 	// load the module
163cdf0e10cSrcweir 	m_pOdbcLib = osl_loadModule(m_sLibPath.pData, SAL_LOADMODULE_NOW);
164cdf0e10cSrcweir 	return (NULL != m_pOdbcLib);
165cdf0e10cSrcweir #endif
166cdf0e10cSrcweir }
167cdf0e10cSrcweir 
168cdf0e10cSrcweir //-------------------------------------------------------------------------
169cdf0e10cSrcweir void OOdbcLibWrapper::unload()
170cdf0e10cSrcweir {
171cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT
172cdf0e10cSrcweir 	if (isLoaded())
173cdf0e10cSrcweir 	{
174cdf0e10cSrcweir 		osl_unloadModule(m_pOdbcLib);
175cdf0e10cSrcweir 		m_pOdbcLib = NULL;
176cdf0e10cSrcweir 	}
177cdf0e10cSrcweir #endif
178cdf0e10cSrcweir }
179cdf0e10cSrcweir 
180cdf0e10cSrcweir //-------------------------------------------------------------------------
181cdf0e10cSrcweir oslGenericFunction OOdbcLibWrapper::loadSymbol(const sal_Char* _pFunctionName)
182cdf0e10cSrcweir {
183cdf0e10cSrcweir 	return osl_getFunctionSymbol(m_pOdbcLib, ::rtl::OUString::createFromAscii(_pFunctionName).pData);
184cdf0e10cSrcweir }
185cdf0e10cSrcweir 
186cdf0e10cSrcweir //-------------------------------------------------------------------------
187cdf0e10cSrcweir OOdbcLibWrapper::~OOdbcLibWrapper()
188cdf0e10cSrcweir {
189cdf0e10cSrcweir 	unload();
190cdf0e10cSrcweir 
191cdf0e10cSrcweir     DBG_DTOR(OOdbcLibWrapper,NULL);
192cdf0e10cSrcweir }
193cdf0e10cSrcweir 
194cdf0e10cSrcweir //=========================================================================
195cdf0e10cSrcweir //= OOdbcEnumeration
196cdf0e10cSrcweir //=========================================================================
197cdf0e10cSrcweir struct OdbcTypesImpl
198cdf0e10cSrcweir {
199cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT
200cdf0e10cSrcweir 	SQLHANDLE	hEnvironment;
201cdf0e10cSrcweir 	OdbcTypesImpl() : hEnvironment(0) { }
202cdf0e10cSrcweir #else
203cdf0e10cSrcweir 	void*		pDummy;
204cdf0e10cSrcweir #endif
205cdf0e10cSrcweir };
206cdf0e10cSrcweir DBG_NAME(OOdbcEnumeration)
207cdf0e10cSrcweir //-------------------------------------------------------------------------
208cdf0e10cSrcweir OOdbcEnumeration::OOdbcEnumeration()
209cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT
210cdf0e10cSrcweir 	:m_pAllocHandle(NULL)
211cdf0e10cSrcweir 	,m_pSetEnvAttr(NULL)
212cdf0e10cSrcweir 	,m_pDataSources(NULL)
213cdf0e10cSrcweir 	,m_pImpl(new OdbcTypesImpl)
214cdf0e10cSrcweir #endif
215cdf0e10cSrcweir {
216cdf0e10cSrcweir     DBG_CTOR(OOdbcEnumeration,NULL);
217cdf0e10cSrcweir 
218cdf0e10cSrcweir 	sal_Bool bLoaded = load(ODBC_LIBRARY);
219cdf0e10cSrcweir #ifdef ODBC_LIBRARY_1
220cdf0e10cSrcweir 	if ( !bLoaded )
221cdf0e10cSrcweir 		bLoaded = load(ODBC_LIBRARY_1);
222cdf0e10cSrcweir #endif
223cdf0e10cSrcweir 
224cdf0e10cSrcweir 	if ( bLoaded )
225cdf0e10cSrcweir 	{
226cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT
227cdf0e10cSrcweir 		// load the generic functions
228cdf0e10cSrcweir 		m_pAllocHandle = loadSymbol("SQLAllocHandle");
229cdf0e10cSrcweir 		m_pFreeHandle = loadSymbol("SQLFreeHandle");
230cdf0e10cSrcweir 		m_pSetEnvAttr = loadSymbol("SQLSetEnvAttr");
231cdf0e10cSrcweir 		m_pDataSources = loadSymbol("SQLDataSources");
232cdf0e10cSrcweir 
233cdf0e10cSrcweir 		// all or nothing
234cdf0e10cSrcweir 		if (!m_pAllocHandle || !m_pSetEnvAttr || !m_pDataSources || !m_pFreeHandle)
235cdf0e10cSrcweir 		{
236cdf0e10cSrcweir 			unload();
237cdf0e10cSrcweir 			m_pAllocHandle = m_pFreeHandle = m_pSetEnvAttr = m_pDataSources = NULL;
238cdf0e10cSrcweir 		}
239cdf0e10cSrcweir #endif
240cdf0e10cSrcweir 	}
241cdf0e10cSrcweir }
242cdf0e10cSrcweir 
243cdf0e10cSrcweir //-------------------------------------------------------------------------
244cdf0e10cSrcweir OOdbcEnumeration::~OOdbcEnumeration()
245cdf0e10cSrcweir {
246cdf0e10cSrcweir 	freeEnv();
247cdf0e10cSrcweir 	delete m_pImpl;
248cdf0e10cSrcweir 
249cdf0e10cSrcweir     DBG_DTOR(OOdbcEnumeration,NULL);
250cdf0e10cSrcweir }
251cdf0e10cSrcweir 
252cdf0e10cSrcweir //-------------------------------------------------------------------------
253cdf0e10cSrcweir sal_Bool OOdbcEnumeration::allocEnv()
254cdf0e10cSrcweir {
255cdf0e10cSrcweir 	OSL_ENSURE(isLoaded(), "OOdbcEnumeration::allocEnv: not loaded!");
256cdf0e10cSrcweir 	if (!isLoaded())
257cdf0e10cSrcweir 		return sal_False;
258cdf0e10cSrcweir 
259cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT
260cdf0e10cSrcweir 	if (m_pImpl->hEnvironment)
261cdf0e10cSrcweir 		// nothing to do
262cdf0e10cSrcweir 		return sal_True;
263cdf0e10cSrcweir 	SQLRETURN nResult = NSQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &m_pImpl->hEnvironment);
264cdf0e10cSrcweir 	if (SQL_SUCCESS != nResult)
265cdf0e10cSrcweir 		// can't do anything without environment
266cdf0e10cSrcweir 		return sal_False;
267cdf0e10cSrcweir 
268cdf0e10cSrcweir 	NSQLSetEnvAttr(m_pImpl->hEnvironment, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
269cdf0e10cSrcweir 	return sal_True;
270cdf0e10cSrcweir #else
271cdf0e10cSrcweir 	return sal_False;
272cdf0e10cSrcweir #endif
273cdf0e10cSrcweir }
274cdf0e10cSrcweir 
275cdf0e10cSrcweir //-------------------------------------------------------------------------
276cdf0e10cSrcweir void OOdbcEnumeration::freeEnv()
277cdf0e10cSrcweir {
278cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT
279cdf0e10cSrcweir 	if (m_pImpl->hEnvironment)
280cdf0e10cSrcweir 		NSQLFreeHandle(SQL_HANDLE_ENV, m_pImpl->hEnvironment);
281cdf0e10cSrcweir 	m_pImpl->hEnvironment  = 0;
282cdf0e10cSrcweir #endif
283cdf0e10cSrcweir }
284cdf0e10cSrcweir 
285cdf0e10cSrcweir //-------------------------------------------------------------------------
286cdf0e10cSrcweir void OOdbcEnumeration::getDatasourceNames(StringBag& _rNames)
287cdf0e10cSrcweir {
288cdf0e10cSrcweir 	OSL_ENSURE(isLoaded(), "OOdbcEnumeration::getDatasourceNames: not loaded!");
289cdf0e10cSrcweir 	if (!isLoaded())
290cdf0e10cSrcweir 		return;
291cdf0e10cSrcweir 
292cdf0e10cSrcweir 	if (!allocEnv())
293cdf0e10cSrcweir 	{
294cdf0e10cSrcweir 		OSL_ENSURE(sal_False, "OOdbcEnumeration::getDatasourceNames: could not allocate an ODBC environment!");
295cdf0e10cSrcweir 		return;
296cdf0e10cSrcweir 	}
297cdf0e10cSrcweir 
298cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT
299cdf0e10cSrcweir 	// now that we have an environment collect the data source names
300cdf0e10cSrcweir 	UCHAR szDSN[SQL_MAX_DSN_LENGTH+1];
301cdf0e10cSrcweir 	SWORD pcbDSN;
302cdf0e10cSrcweir 	UCHAR szDescription[1024+1];
303cdf0e10cSrcweir 	SWORD pcbDescription;
304cdf0e10cSrcweir 	SQLRETURN nResult = SQL_SUCCESS;
305cdf0e10cSrcweir     rtl_TextEncoding nTextEncoding = osl_getThreadTextEncoding();
306cdf0e10cSrcweir 
307cdf0e10cSrcweir 	for (	nResult = NSQLDataSources(m_pImpl->hEnvironment, SQL_FETCH_FIRST, szDSN, sizeof(szDSN), &pcbDSN, szDescription, sizeof(szDescription)-1, &pcbDescription);
308cdf0e10cSrcweir 			;
309cdf0e10cSrcweir 			nResult = NSQLDataSources(m_pImpl->hEnvironment, SQL_FETCH_NEXT, szDSN, sizeof(szDSN), &pcbDSN, szDescription, sizeof(szDescription)-1, &pcbDescription)
310cdf0e10cSrcweir 		)
311cdf0e10cSrcweir 	{
312cdf0e10cSrcweir 		if (nResult != SQL_SUCCESS)
313cdf0e10cSrcweir 			// no further error handling
314cdf0e10cSrcweir 			break;
315cdf0e10cSrcweir 		else
316cdf0e10cSrcweir 		{
317cdf0e10cSrcweir             ::rtl::OUString aCurrentDsn(reinterpret_cast<const char*>(szDSN),pcbDSN, nTextEncoding);
318cdf0e10cSrcweir 			_rNames.insert(aCurrentDsn);
319cdf0e10cSrcweir 		}
320cdf0e10cSrcweir 	}
321cdf0e10cSrcweir #endif
322cdf0e10cSrcweir }
323cdf0e10cSrcweir 
324cdf0e10cSrcweir #ifdef HAVE_ODBC_ADMINISTRATION
325cdf0e10cSrcweir 
326cdf0e10cSrcweir //=========================================================================
327cdf0e10cSrcweir //= ProcessTerminationWait
328cdf0e10cSrcweir //=========================================================================
329cdf0e10cSrcweir class ProcessTerminationWait : public ::osl::Thread
330cdf0e10cSrcweir {
331cdf0e10cSrcweir     oslProcess  m_hProcessHandle;
332cdf0e10cSrcweir     Link        m_aFinishHdl;
333cdf0e10cSrcweir 
334cdf0e10cSrcweir public:
335cdf0e10cSrcweir     ProcessTerminationWait( oslProcess _hProcessHandle, const Link& _rFinishHdl )
336cdf0e10cSrcweir         :m_hProcessHandle( _hProcessHandle )
337cdf0e10cSrcweir         ,m_aFinishHdl( _rFinishHdl )
338cdf0e10cSrcweir     {
339cdf0e10cSrcweir     }
340cdf0e10cSrcweir 
341cdf0e10cSrcweir protected:
342cdf0e10cSrcweir     virtual void SAL_CALL run()
343cdf0e10cSrcweir     {
344cdf0e10cSrcweir         osl_joinProcess( m_hProcessHandle );
345cdf0e10cSrcweir         osl_freeProcessHandle( m_hProcessHandle );
346cdf0e10cSrcweir         Application::PostUserEvent( m_aFinishHdl );
347cdf0e10cSrcweir     }
348cdf0e10cSrcweir };
349cdf0e10cSrcweir 
350cdf0e10cSrcweir //=========================================================================
351cdf0e10cSrcweir //= OOdbcManagement
352cdf0e10cSrcweir //=========================================================================
353cdf0e10cSrcweir //-------------------------------------------------------------------------
354cdf0e10cSrcweir OOdbcManagement::OOdbcManagement( const Link& _rAsyncFinishCallback )
355cdf0e10cSrcweir     :m_pProcessWait( NULL )
356cdf0e10cSrcweir     ,m_aAsyncFinishCallback( _rAsyncFinishCallback )
357cdf0e10cSrcweir {
358cdf0e10cSrcweir }
359cdf0e10cSrcweir 
360cdf0e10cSrcweir //-------------------------------------------------------------------------
361cdf0e10cSrcweir OOdbcManagement::~OOdbcManagement()
362cdf0e10cSrcweir {
363cdf0e10cSrcweir     // wait for our thread to be finished
364cdf0e10cSrcweir     if ( m_pProcessWait.get() )
365cdf0e10cSrcweir         m_pProcessWait->join();
366cdf0e10cSrcweir }
367cdf0e10cSrcweir 
368cdf0e10cSrcweir //-------------------------------------------------------------------------
369cdf0e10cSrcweir bool OOdbcManagement::manageDataSources_async()
370cdf0e10cSrcweir {
371cdf0e10cSrcweir     OSL_PRECOND( !isRunning(), "OOdbcManagement::manageDataSources_async: still running from the previous call!" );
372cdf0e10cSrcweir     if ( isRunning() )
373cdf0e10cSrcweir         return false;
374cdf0e10cSrcweir 
375cdf0e10cSrcweir     // this is done in an external process, due to #i78733#
376cdf0e10cSrcweir     // (and note this whole functionality is supported on Windows only, ATM)
377cdf0e10cSrcweir     ::rtl::OUString sExecutableName( RTL_CONSTASCII_USTRINGPARAM( "$OOO_BASE_DIR/program/odbcconfig.exe" ) );
378cdf0e10cSrcweir     ::rtl::Bootstrap::expandMacros( sExecutableName ); //TODO: detect failure
379cdf0e10cSrcweir     oslProcess hProcessHandle(0);
380cdf0e10cSrcweir     oslProcessError eError = osl_executeProcess( sExecutableName.pData, NULL, 0, 0, NULL, NULL, NULL, 0, &hProcessHandle );
381cdf0e10cSrcweir     if ( eError != osl_Process_E_None )
382cdf0e10cSrcweir         return false;
383cdf0e10cSrcweir 
384cdf0e10cSrcweir     m_pProcessWait.reset( new ProcessTerminationWait( hProcessHandle, m_aAsyncFinishCallback ) );
385cdf0e10cSrcweir     m_pProcessWait->create();
386cdf0e10cSrcweir     return true;
387cdf0e10cSrcweir }
388cdf0e10cSrcweir 
389cdf0e10cSrcweir //-------------------------------------------------------------------------
390cdf0e10cSrcweir bool OOdbcManagement::isRunning() const
391cdf0e10cSrcweir {
392cdf0e10cSrcweir     return ( m_pProcessWait.get() && m_pProcessWait->isRunning() );
393cdf0e10cSrcweir }
394cdf0e10cSrcweir 
395cdf0e10cSrcweir #endif // HAVE_ODBC_ADMINISTRATION
396cdf0e10cSrcweir 
397cdf0e10cSrcweir //.........................................................................
398cdf0e10cSrcweir }	// namespace dbaui
399cdf0e10cSrcweir //.........................................................................
400