xref: /trunk/main/dbaccess/source/ui/misc/datasourceconnector.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_dbaccess.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #ifndef _DBAUI_DATASOURCECONNECTOR_HXX_
32*cdf0e10cSrcweir #include "datasourceconnector.hxx"
33*cdf0e10cSrcweir #endif
34*cdf0e10cSrcweir #ifndef _OSL_DIAGNOSE_H_
35*cdf0e10cSrcweir #include <osl/diagnose.h>
36*cdf0e10cSrcweir #endif
37*cdf0e10cSrcweir #ifndef DBACCESS_SHARED_DBUSTRINGS_HRC
38*cdf0e10cSrcweir #include "dbustrings.hrc"
39*cdf0e10cSrcweir #endif
40*cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDBC_XWARNINGSSUPPLIER_HPP_
41*cdf0e10cSrcweir #include <com/sun/star/sdbc/XWarningsSupplier.hpp>
42*cdf0e10cSrcweir #endif
43*cdf0e10cSrcweir #ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
44*cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
45*cdf0e10cSrcweir #endif
46*cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDB_XCOMPLETEDCONNECTION_HPP_
47*cdf0e10cSrcweir #include <com/sun/star/sdb/XCompletedConnection.hpp>
48*cdf0e10cSrcweir #endif
49*cdf0e10cSrcweir #ifndef _COM_SUN_STAR_TASK_XINTERACTIONHANDLER_HPP_
50*cdf0e10cSrcweir #include <com/sun/star/task/XInteractionHandler.hpp>
51*cdf0e10cSrcweir #endif
52*cdf0e10cSrcweir #ifndef _COM_SUN_STAR_FRAME_XMODEL_HPP_
53*cdf0e10cSrcweir #include <com/sun/star/frame/XModel.hpp>
54*cdf0e10cSrcweir #endif
55*cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDB_SQLCONTEXT_HPP_
56*cdf0e10cSrcweir #include <com/sun/star/sdb/SQLContext.hpp>
57*cdf0e10cSrcweir #endif
58*cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDBC_SQLWARNING_HPP_
59*cdf0e10cSrcweir #include <com/sun/star/sdbc/SQLWarning.hpp>
60*cdf0e10cSrcweir #endif
61*cdf0e10cSrcweir #ifndef _OSL_THREAD_H_
62*cdf0e10cSrcweir #include <osl/thread.h>
63*cdf0e10cSrcweir #endif
64*cdf0e10cSrcweir #ifndef _COMPHELPER_EXTRACT_HXX_
65*cdf0e10cSrcweir #include <comphelper/extract.hxx>
66*cdf0e10cSrcweir #endif
67*cdf0e10cSrcweir #ifndef COMPHELPER_NAMEDVALUECOLLECTION_HXX
68*cdf0e10cSrcweir #include <comphelper/namedvaluecollection.hxx>
69*cdf0e10cSrcweir #endif
70*cdf0e10cSrcweir #ifndef _DBHELPER_DBEXCEPTION_HXX_
71*cdf0e10cSrcweir #include <connectivity/dbexception.hxx>
72*cdf0e10cSrcweir #endif
73*cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDBC_XDATASOURCE_HPP_
74*cdf0e10cSrcweir #include <com/sun/star/sdbc/XDataSource.hpp>
75*cdf0e10cSrcweir #endif
76*cdf0e10cSrcweir #ifndef DBAUI_TOOLS_HXX
77*cdf0e10cSrcweir #include "UITools.hxx"
78*cdf0e10cSrcweir #endif
79*cdf0e10cSrcweir #ifndef _VCL_STDTEXT_HXX
80*cdf0e10cSrcweir #include <vcl/stdtext.hxx>
81*cdf0e10cSrcweir #endif
82*cdf0e10cSrcweir #ifndef _SV_BUTTON_HXX
83*cdf0e10cSrcweir #include <vcl/button.hxx>
84*cdf0e10cSrcweir #endif
85*cdf0e10cSrcweir #ifndef SVTOOLS_FILENOTATION_HXX
86*cdf0e10cSrcweir #include <svl/filenotation.hxx>
87*cdf0e10cSrcweir #endif
88*cdf0e10cSrcweir #ifndef TOOLS_DIAGNOSE_EX_H
89*cdf0e10cSrcweir #include <tools/diagnose_ex.h>
90*cdf0e10cSrcweir #endif
91*cdf0e10cSrcweir #ifndef _CPPUHELPER_EXC_HLP_HXX_
92*cdf0e10cSrcweir #include <cppuhelper/exc_hlp.hxx>
93*cdf0e10cSrcweir #endif
94*cdf0e10cSrcweir #ifndef _DBU_MISC_HRC_
95*cdf0e10cSrcweir #include "dbu_misc.hrc"
96*cdf0e10cSrcweir #endif
97*cdf0e10cSrcweir #include "moduledbu.hxx"
98*cdf0e10cSrcweir 
99*cdf0e10cSrcweir //.........................................................................
100*cdf0e10cSrcweir namespace dbaui
101*cdf0e10cSrcweir {
102*cdf0e10cSrcweir //.........................................................................
103*cdf0e10cSrcweir 
104*cdf0e10cSrcweir     using namespace ::com::sun::star::uno;
105*cdf0e10cSrcweir     using namespace ::com::sun::star::lang;
106*cdf0e10cSrcweir     using namespace ::com::sun::star::sdb;
107*cdf0e10cSrcweir     using namespace ::com::sun::star::sdbc;
108*cdf0e10cSrcweir     using namespace ::com::sun::star::task;
109*cdf0e10cSrcweir     using namespace ::com::sun::star::beans;
110*cdf0e10cSrcweir     using namespace ::com::sun::star::container;
111*cdf0e10cSrcweir     using namespace ::com::sun::star::frame;
112*cdf0e10cSrcweir     using namespace ::dbtools;
113*cdf0e10cSrcweir     using ::svt::OFileNotation;
114*cdf0e10cSrcweir 
115*cdf0e10cSrcweir     //=====================================================================
116*cdf0e10cSrcweir     //= ODatasourceConnector
117*cdf0e10cSrcweir     //=====================================================================
118*cdf0e10cSrcweir     //---------------------------------------------------------------------
119*cdf0e10cSrcweir     ODatasourceConnector::ODatasourceConnector(const Reference< XMultiServiceFactory >& _rxORB, Window* _pMessageParent)
120*cdf0e10cSrcweir         :m_pErrorMessageParent(_pMessageParent)
121*cdf0e10cSrcweir         ,m_xORB(_rxORB)
122*cdf0e10cSrcweir     {
123*cdf0e10cSrcweir     }
124*cdf0e10cSrcweir 
125*cdf0e10cSrcweir     //---------------------------------------------------------------------
126*cdf0e10cSrcweir     ODatasourceConnector::ODatasourceConnector( const Reference< XMultiServiceFactory >& _rxORB, Window* _pMessageParent,
127*cdf0e10cSrcweir         const ::rtl::OUString& _rContextInformation )
128*cdf0e10cSrcweir         :m_pErrorMessageParent(_pMessageParent)
129*cdf0e10cSrcweir         ,m_xORB(_rxORB)
130*cdf0e10cSrcweir         ,m_sContextInformation( _rContextInformation )
131*cdf0e10cSrcweir     {
132*cdf0e10cSrcweir     }
133*cdf0e10cSrcweir 
134*cdf0e10cSrcweir     //---------------------------------------------------------------------
135*cdf0e10cSrcweir     Reference< XConnection > ODatasourceConnector::connect( const ::rtl::OUString& _rDataSourceName,
136*cdf0e10cSrcweir         ::dbtools::SQLExceptionInfo* _pErrorInfo ) const
137*cdf0e10cSrcweir     {
138*cdf0e10cSrcweir         Reference< XConnection > xConnection;
139*cdf0e10cSrcweir 
140*cdf0e10cSrcweir         OSL_ENSURE(isValid(), "ODatasourceConnector::connect: invalid object!");
141*cdf0e10cSrcweir         if (!isValid())
142*cdf0e10cSrcweir             return xConnection;
143*cdf0e10cSrcweir 
144*cdf0e10cSrcweir         // get the data source
145*cdf0e10cSrcweir         Reference< XDataSource > xDatasource(
146*cdf0e10cSrcweir             getDataSourceByName( _rDataSourceName, m_pErrorMessageParent, m_xORB, _pErrorInfo ),
147*cdf0e10cSrcweir             UNO_QUERY
148*cdf0e10cSrcweir         );
149*cdf0e10cSrcweir 
150*cdf0e10cSrcweir         if ( xDatasource.is() )
151*cdf0e10cSrcweir             xConnection = connect( xDatasource, _pErrorInfo );
152*cdf0e10cSrcweir         return xConnection;
153*cdf0e10cSrcweir     }
154*cdf0e10cSrcweir 
155*cdf0e10cSrcweir     //---------------------------------------------------------------------
156*cdf0e10cSrcweir     Reference< XConnection > ODatasourceConnector::connect(const Reference< XDataSource>& _xDataSource,
157*cdf0e10cSrcweir         ::dbtools::SQLExceptionInfo* _pErrorInfo ) const
158*cdf0e10cSrcweir     {
159*cdf0e10cSrcweir         Reference< XConnection > xConnection;
160*cdf0e10cSrcweir 
161*cdf0e10cSrcweir         OSL_ENSURE( isValid() && _xDataSource.is(), "ODatasourceConnector::connect: invalid object or argument!" );
162*cdf0e10cSrcweir         if ( !isValid() || !_xDataSource.is() )
163*cdf0e10cSrcweir             return xConnection;
164*cdf0e10cSrcweir 
165*cdf0e10cSrcweir         // get user/password
166*cdf0e10cSrcweir         ::rtl::OUString sPassword, sUser;
167*cdf0e10cSrcweir         sal_Bool bPwdRequired = sal_False;
168*cdf0e10cSrcweir         Reference<XPropertySet> xProp(_xDataSource,UNO_QUERY);
169*cdf0e10cSrcweir         try
170*cdf0e10cSrcweir         {
171*cdf0e10cSrcweir             xProp->getPropertyValue(PROPERTY_PASSWORD) >>= sPassword;
172*cdf0e10cSrcweir             xProp->getPropertyValue(PROPERTY_ISPASSWORDREQUIRED) >>= bPwdRequired;
173*cdf0e10cSrcweir             xProp->getPropertyValue(PROPERTY_USER) >>= sUser;
174*cdf0e10cSrcweir         }
175*cdf0e10cSrcweir         catch(Exception&)
176*cdf0e10cSrcweir         {
177*cdf0e10cSrcweir             DBG_UNHANDLED_EXCEPTION();
178*cdf0e10cSrcweir         }
179*cdf0e10cSrcweir 
180*cdf0e10cSrcweir         // try to connect
181*cdf0e10cSrcweir         SQLExceptionInfo aInfo;
182*cdf0e10cSrcweir         try
183*cdf0e10cSrcweir         {
184*cdf0e10cSrcweir             if (bPwdRequired && !sPassword.getLength())
185*cdf0e10cSrcweir             {   // password required, but empty -> connect using an interaction handler
186*cdf0e10cSrcweir                 Reference< XCompletedConnection > xConnectionCompletion( _xDataSource, UNO_QUERY_THROW );
187*cdf0e10cSrcweir 
188*cdf0e10cSrcweir                 Reference< XModel > xModel( getDataSourceOrModel( _xDataSource ), UNO_QUERY_THROW );
189*cdf0e10cSrcweir                 ::comphelper::NamedValueCollection aArgs( xModel->getArgs() );
190*cdf0e10cSrcweir                 Reference< XInteractionHandler > xHandler( aArgs.getOrDefault( "InteractionHandler", Reference< XInteractionHandler >() ) );
191*cdf0e10cSrcweir 
192*cdf0e10cSrcweir                 if ( !xHandler.is() )
193*cdf0e10cSrcweir                 {
194*cdf0e10cSrcweir                     // instantiate the default SDB interaction handler
195*cdf0e10cSrcweir                     xHandler = Reference< XInteractionHandler >( m_xORB->createInstance( SERVICE_TASK_INTERACTION_HANDLER ), UNO_QUERY );
196*cdf0e10cSrcweir                     if ( !xHandler.is() )
197*cdf0e10cSrcweir                         ShowServiceNotAvailableError(m_pErrorMessageParent, (::rtl::OUString)SERVICE_TASK_INTERACTION_HANDLER, sal_True);
198*cdf0e10cSrcweir                 }
199*cdf0e10cSrcweir 
200*cdf0e10cSrcweir                 if ( xHandler.is() )
201*cdf0e10cSrcweir                 {
202*cdf0e10cSrcweir                     xConnection = xConnectionCompletion->connectWithCompletion(xHandler);
203*cdf0e10cSrcweir                 }
204*cdf0e10cSrcweir             }
205*cdf0e10cSrcweir             else
206*cdf0e10cSrcweir             {
207*cdf0e10cSrcweir                 xConnection = _xDataSource->getConnection(sUser, sPassword);
208*cdf0e10cSrcweir             }
209*cdf0e10cSrcweir         }
210*cdf0e10cSrcweir         catch( const SQLException& )
211*cdf0e10cSrcweir         {
212*cdf0e10cSrcweir             aInfo = ::cppu::getCaughtException();
213*cdf0e10cSrcweir         }
214*cdf0e10cSrcweir         catch(const Exception&)
215*cdf0e10cSrcweir         {
216*cdf0e10cSrcweir             DBG_UNHANDLED_EXCEPTION();
217*cdf0e10cSrcweir         }
218*cdf0e10cSrcweir 
219*cdf0e10cSrcweir         if ( !aInfo.isValid() )
220*cdf0e10cSrcweir         {
221*cdf0e10cSrcweir             // there was no error during connecting, but perhaps a warning?
222*cdf0e10cSrcweir             Reference< XWarningsSupplier > xConnectionWarnings( xConnection, UNO_QUERY );
223*cdf0e10cSrcweir             if ( xConnectionWarnings.is() )
224*cdf0e10cSrcweir             {
225*cdf0e10cSrcweir                 try
226*cdf0e10cSrcweir                 {
227*cdf0e10cSrcweir                     Any aWarnings( xConnectionWarnings->getWarnings() );
228*cdf0e10cSrcweir                     if ( aWarnings.hasValue() )
229*cdf0e10cSrcweir                     {
230*cdf0e10cSrcweir                         String sMessage( ModuleRes( STR_WARNINGS_DURING_CONNECT ) );
231*cdf0e10cSrcweir                         sMessage.SearchAndReplaceAscii( "$buttontext$", Button::GetStandardText( BUTTON_MORE ) );
232*cdf0e10cSrcweir                         sMessage = OutputDevice::GetNonMnemonicString( sMessage );
233*cdf0e10cSrcweir 
234*cdf0e10cSrcweir                         SQLWarning aContext;
235*cdf0e10cSrcweir                         aContext.Message = sMessage;
236*cdf0e10cSrcweir                         aContext.NextException = aWarnings;
237*cdf0e10cSrcweir                         aInfo = aContext;
238*cdf0e10cSrcweir                     }
239*cdf0e10cSrcweir                     xConnectionWarnings->clearWarnings();
240*cdf0e10cSrcweir                 }
241*cdf0e10cSrcweir                 catch( const Exception& )
242*cdf0e10cSrcweir                 {
243*cdf0e10cSrcweir                     DBG_UNHANDLED_EXCEPTION();
244*cdf0e10cSrcweir                 }
245*cdf0e10cSrcweir             }
246*cdf0e10cSrcweir         }
247*cdf0e10cSrcweir         else
248*cdf0e10cSrcweir         {
249*cdf0e10cSrcweir             if ( m_sContextInformation.getLength() )
250*cdf0e10cSrcweir             {
251*cdf0e10cSrcweir                 SQLException aError;
252*cdf0e10cSrcweir                 aError.Message = m_sContextInformation;
253*cdf0e10cSrcweir                 aError.NextException = aInfo.get();
254*cdf0e10cSrcweir 
255*cdf0e10cSrcweir                 aInfo = aError;
256*cdf0e10cSrcweir             }
257*cdf0e10cSrcweir         }
258*cdf0e10cSrcweir 
259*cdf0e10cSrcweir         // was there an error?
260*cdf0e10cSrcweir         if ( aInfo.isValid() )
261*cdf0e10cSrcweir         {
262*cdf0e10cSrcweir             if ( _pErrorInfo )
263*cdf0e10cSrcweir             {
264*cdf0e10cSrcweir                 *_pErrorInfo = aInfo;
265*cdf0e10cSrcweir             }
266*cdf0e10cSrcweir             else
267*cdf0e10cSrcweir             {
268*cdf0e10cSrcweir                 showError( aInfo, m_pErrorMessageParent, m_xORB );
269*cdf0e10cSrcweir             }
270*cdf0e10cSrcweir         }
271*cdf0e10cSrcweir         return xConnection;
272*cdf0e10cSrcweir     }
273*cdf0e10cSrcweir 
274*cdf0e10cSrcweir //.........................................................................
275*cdf0e10cSrcweir }   // namespace dbaui
276*cdf0e10cSrcweir //.........................................................................
277*cdf0e10cSrcweir 
278