Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*
3 : : * This file is part of the LibreOffice project.
4 : : *
5 : : * This Source Code Form is subject to the terms of the Mozilla Public
6 : : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : : *
9 : : * This file incorporates work covered by the following license notice:
10 : : *
11 : : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : : * contributor license agreements. See the NOTICE file distributed
13 : : * with this work for additional information regarding copyright
14 : : * ownership. The ASF licenses this file to you under the Apache
15 : : * License, Version 2.0 (the "License"); you may not use this file
16 : : * except in compliance with the License. You may obtain a copy of
17 : : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : : */
19 : :
20 : :
21 : : #include "datasourceconnector.hxx"
22 : : #include <osl/diagnose.h>
23 : : #include "dbustrings.hrc"
24 : : #include <com/sun/star/sdbc/XWarningsSupplier.hpp>
25 : : #include <com/sun/star/beans/XPropertySet.hpp>
26 : : #include <com/sun/star/sdb/XCompletedConnection.hpp>
27 : : #include <com/sun/star/task/XInteractionHandler.hpp>
28 : : #include <com/sun/star/frame/XModel.hpp>
29 : : #include <com/sun/star/sdb/SQLContext.hpp>
30 : : #include <com/sun/star/sdbc/SQLWarning.hpp>
31 : : #include <osl/thread.h>
32 : : #include <comphelper/extract.hxx>
33 : : #include <comphelper/namedvaluecollection.hxx>
34 : : #include <connectivity/dbexception.hxx>
35 : : #include <com/sun/star/sdbc/XDataSource.hpp>
36 : : #include "UITools.hxx"
37 : : #include <vcl/stdtext.hxx>
38 : : #include <vcl/button.hxx>
39 : : #include <svl/filenotation.hxx>
40 : : #include <tools/diagnose_ex.h>
41 : : #include <cppuhelper/exc_hlp.hxx>
42 : : #include "dbu_misc.hrc"
43 : : #include "moduledbu.hxx"
44 : :
45 : : //.........................................................................
46 : : namespace dbaui
47 : : {
48 : : //.........................................................................
49 : :
50 : : using namespace ::com::sun::star::uno;
51 : : using namespace ::com::sun::star::lang;
52 : : using namespace ::com::sun::star::sdb;
53 : : using namespace ::com::sun::star::sdbc;
54 : : using namespace ::com::sun::star::task;
55 : : using namespace ::com::sun::star::beans;
56 : : using namespace ::com::sun::star::container;
57 : : using namespace ::com::sun::star::frame;
58 : : using namespace ::dbtools;
59 : : using ::svt::OFileNotation;
60 : :
61 : : //=====================================================================
62 : : //= ODatasourceConnector
63 : : //=====================================================================
64 : : //---------------------------------------------------------------------
65 : 0 : ODatasourceConnector::ODatasourceConnector(const Reference< XMultiServiceFactory >& _rxORB, Window* _pMessageParent)
66 : : :m_pErrorMessageParent(_pMessageParent)
67 : 0 : ,m_xORB(_rxORB)
68 : : {
69 : 0 : }
70 : :
71 : : //---------------------------------------------------------------------
72 : 2 : ODatasourceConnector::ODatasourceConnector( const Reference< XMultiServiceFactory >& _rxORB, Window* _pMessageParent,
73 : : const ::rtl::OUString& _rContextInformation )
74 : : :m_pErrorMessageParent(_pMessageParent)
75 : : ,m_xORB(_rxORB)
76 : 2 : ,m_sContextInformation( _rContextInformation )
77 : : {
78 : 2 : }
79 : :
80 : : //---------------------------------------------------------------------
81 : 2 : Reference< XConnection > ODatasourceConnector::connect( const ::rtl::OUString& _rDataSourceName,
82 : : ::dbtools::SQLExceptionInfo* _pErrorInfo ) const
83 : : {
84 : 2 : Reference< XConnection > xConnection;
85 : :
86 : : OSL_ENSURE(isValid(), "ODatasourceConnector::connect: invalid object!");
87 [ + - ]: 2 : if (!isValid())
88 : : return xConnection;
89 : :
90 : : // get the data source
91 : : Reference< XDataSource > xDatasource(
92 : : getDataSourceByName( _rDataSourceName, m_pErrorMessageParent, m_xORB, _pErrorInfo ),
93 : : UNO_QUERY
94 [ + - ][ + - ]: 2 : );
95 : :
96 [ + - ]: 2 : if ( xDatasource.is() )
97 [ + - ][ + - ]: 2 : xConnection = connect( xDatasource, _pErrorInfo );
98 : 2 : return xConnection;
99 : : }
100 : :
101 : : //---------------------------------------------------------------------
102 : 2 : Reference< XConnection > ODatasourceConnector::connect(const Reference< XDataSource>& _xDataSource,
103 : : ::dbtools::SQLExceptionInfo* _pErrorInfo ) const
104 : : {
105 : 2 : Reference< XConnection > xConnection;
106 : :
107 : : OSL_ENSURE( isValid() && _xDataSource.is(), "ODatasourceConnector::connect: invalid object or argument!" );
108 [ - + ][ + - ]: 2 : if ( !isValid() || !_xDataSource.is() )
[ + - ]
109 : : return xConnection;
110 : :
111 : : // get user/password
112 : 2 : ::rtl::OUString sPassword, sUser;
113 : 2 : sal_Bool bPwdRequired = sal_False;
114 [ + - ]: 2 : Reference<XPropertySet> xProp(_xDataSource,UNO_QUERY);
115 : : try
116 : : {
117 [ + - ][ + - ]: 2 : xProp->getPropertyValue(PROPERTY_PASSWORD) >>= sPassword;
[ + - ]
118 [ + - ][ + - ]: 2 : xProp->getPropertyValue(PROPERTY_ISPASSWORDREQUIRED) >>= bPwdRequired;
[ + - ]
119 [ + - ][ + - ]: 2 : xProp->getPropertyValue(PROPERTY_USER) >>= sUser;
[ # # ][ + - ]
120 : : }
121 [ # # ]: 0 : catch(Exception&)
122 : : {
123 : : DBG_UNHANDLED_EXCEPTION();
124 : : }
125 : :
126 : : // try to connect
127 [ + - ]: 2 : SQLExceptionInfo aInfo;
128 : : try
129 : : {
130 [ - + ][ # # ]: 2 : if (bPwdRequired && sPassword.isEmpty())
[ - + ]
131 : : { // password required, but empty -> connect using an interaction handler
132 [ # # ]: 0 : Reference< XCompletedConnection > xConnectionCompletion( _xDataSource, UNO_QUERY_THROW );
133 : :
134 [ # # ][ # # ]: 0 : Reference< XModel > xModel( getDataSourceOrModel( _xDataSource ), UNO_QUERY_THROW );
135 [ # # ][ # # ]: 0 : ::comphelper::NamedValueCollection aArgs( xModel->getArgs() );
[ # # ][ # # ]
136 [ # # ]: 0 : Reference< XInteractionHandler > xHandler( aArgs.getOrDefault( "InteractionHandler", Reference< XInteractionHandler >() ) );
137 : :
138 [ # # ]: 0 : if ( !xHandler.is() )
139 : : {
140 : : // instantiate the default SDB interaction handler
141 [ # # ][ # # ]: 0 : xHandler = Reference< XInteractionHandler >( m_xORB->createInstance( SERVICE_TASK_INTERACTION_HANDLER ), UNO_QUERY );
[ # # ][ # # ]
[ # # ]
142 [ # # ]: 0 : if ( !xHandler.is() )
143 [ # # ][ # # ]: 0 : ShowServiceNotAvailableError(m_pErrorMessageParent, (::rtl::OUString)SERVICE_TASK_INTERACTION_HANDLER, sal_True);
[ # # ][ # # ]
144 : : }
145 : :
146 [ # # ]: 0 : if ( xHandler.is() )
147 : : {
148 [ # # ][ # # ]: 0 : xConnection = xConnectionCompletion->connectWithCompletion(xHandler);
[ # # ]
149 [ # # ]: 0 : }
150 : : }
151 : : else
152 : : {
153 [ + - ][ + - ]: 2 : xConnection = _xDataSource->getConnection(sUser, sPassword);
[ + - ]
154 : : }
155 : : }
156 [ # # # # : 0 : catch( const SQLException& )
# ]
157 : : {
158 [ # # # # ]: 0 : aInfo = ::cppu::getCaughtException();
159 : : }
160 [ # # ]: 0 : catch(const Exception&)
161 : : {
162 : : DBG_UNHANDLED_EXCEPTION();
163 : : }
164 : :
165 [ + - ]: 2 : if ( !aInfo.isValid() )
166 : : {
167 : : // there was no error during connecting, but perhaps a warning?
168 [ + - ]: 2 : Reference< XWarningsSupplier > xConnectionWarnings( xConnection, UNO_QUERY );
169 [ + - ]: 2 : if ( xConnectionWarnings.is() )
170 : : {
171 : : try
172 : : {
173 [ + - ][ + - ]: 2 : Any aWarnings( xConnectionWarnings->getWarnings() );
174 [ - + ]: 2 : if ( aWarnings.hasValue() )
175 : : {
176 [ # # ][ # # ]: 0 : String sMessage( ModuleRes( STR_WARNINGS_DURING_CONNECT ) );
177 [ # # ][ # # ]: 0 : sMessage.SearchAndReplaceAscii( "$buttontext$", Button::GetStandardText( BUTTON_MORE ) );
[ # # ]
178 [ # # ][ # # ]: 0 : sMessage = OutputDevice::GetNonMnemonicString( sMessage );
[ # # ]
179 : :
180 [ # # ]: 0 : SQLWarning aContext;
181 [ # # ]: 0 : aContext.Message = sMessage;
182 : 0 : aContext.NextException = aWarnings;
183 [ # # ][ # # ]: 0 : aInfo = aContext;
[ # # ]
184 : : }
185 [ + - ][ + - ]: 2 : xConnectionWarnings->clearWarnings();
[ # # ]
186 : : }
187 [ # # ]: 0 : catch( const Exception& )
188 : : {
189 : : DBG_UNHANDLED_EXCEPTION();
190 : : }
191 : 2 : }
192 : : }
193 : : else
194 : : {
195 [ # # ]: 0 : if ( !m_sContextInformation.isEmpty() )
196 : : {
197 [ # # ]: 0 : SQLException aError;
198 : 0 : aError.Message = m_sContextInformation;
199 : 0 : aError.NextException = aInfo.get();
200 : :
201 [ # # ][ # # ]: 0 : aInfo = aError;
202 : : }
203 : : }
204 : :
205 : : // was there an error?
206 [ - + ]: 2 : if ( aInfo.isValid() )
207 : : {
208 [ # # ]: 0 : if ( _pErrorInfo )
209 : : {
210 [ # # ]: 0 : *_pErrorInfo = aInfo;
211 : : }
212 : : else
213 : : {
214 [ # # ]: 0 : showError( aInfo, m_pErrorMessageParent, m_xORB );
215 : : }
216 : : }
217 [ + - ]: 2 : return xConnection;
218 : : }
219 : :
220 : : //.........................................................................
221 : : } // namespace dbaui
222 : : //.........................................................................
223 : :
224 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|