xref: /AOO41X/main/dbaccess/source/ui/dlg/DbAdminImpl.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 #include "DbAdminImpl.hxx"
32*cdf0e10cSrcweir #include "dsmeta.hxx"
33*cdf0e10cSrcweir 
34*cdf0e10cSrcweir #include <svl/poolitem.hxx>
35*cdf0e10cSrcweir #include <svl/itempool.hxx>
36*cdf0e10cSrcweir #include <svl/stritem.hxx>
37*cdf0e10cSrcweir #include <svl/intitem.hxx>
38*cdf0e10cSrcweir #include <svl/eitem.hxx>
39*cdf0e10cSrcweir #include "DriverSettings.hxx"
40*cdf0e10cSrcweir #include "IItemSetHelper.hxx"
41*cdf0e10cSrcweir #include "UITools.hxx"
42*cdf0e10cSrcweir #include "dbu_dlg.hrc"
43*cdf0e10cSrcweir #include "dbustrings.hrc"
44*cdf0e10cSrcweir #include "dsitems.hxx"
45*cdf0e10cSrcweir #include "dsnItem.hxx"
46*cdf0e10cSrcweir #include "moduledbu.hxx"
47*cdf0e10cSrcweir #include "optionalboolitem.hxx"
48*cdf0e10cSrcweir #include "propertysetitem.hxx"
49*cdf0e10cSrcweir #include "stringlistitem.hxx"
50*cdf0e10cSrcweir #include "OAuthenticationContinuation.hxx"
51*cdf0e10cSrcweir 
52*cdf0e10cSrcweir /** === begin UNO includes === **/
53*cdf0e10cSrcweir #include <com/sun/star/beans/PropertyAttribute.hpp>
54*cdf0e10cSrcweir #include <com/sun/star/frame/XStorable.hpp>
55*cdf0e10cSrcweir #include <com/sun/star/sdb/SQLContext.hpp>
56*cdf0e10cSrcweir #include <com/sun/star/sdbc/XDriver.hpp>
57*cdf0e10cSrcweir #include <com/sun/star/sdbc/XDriverAccess.hpp>
58*cdf0e10cSrcweir #include <com/sun/star/task/XInteractionHandler.hpp>
59*cdf0e10cSrcweir #include <com/sun/star/task/XInteractionRequest.hpp>
60*cdf0e10cSrcweir #include <com/sun/star/ucb/XInteractionSupplyAuthentication2.hpp>
61*cdf0e10cSrcweir #include <com/sun/star/ucb/AuthenticationRequest.hpp>
62*cdf0e10cSrcweir /** === end UNO includes === **/
63*cdf0e10cSrcweir 
64*cdf0e10cSrcweir #include <comphelper/interaction.hxx>
65*cdf0e10cSrcweir #include <comphelper/property.hxx>
66*cdf0e10cSrcweir #include <comphelper/sequence.hxx>
67*cdf0e10cSrcweir #include <comphelper/guarding.hxx>
68*cdf0e10cSrcweir #include <connectivity/DriversConfig.hxx>
69*cdf0e10cSrcweir #include <connectivity/dbexception.hxx>
70*cdf0e10cSrcweir #include <osl/file.hxx>
71*cdf0e10cSrcweir #include <svl/eitem.hxx>
72*cdf0e10cSrcweir #include <svl/intitem.hxx>
73*cdf0e10cSrcweir #include <svl/itempool.hxx>
74*cdf0e10cSrcweir #include <svl/poolitem.hxx>
75*cdf0e10cSrcweir #include <svl/stritem.hxx>
76*cdf0e10cSrcweir #include <tools/urlobj.hxx>
77*cdf0e10cSrcweir #include <tools/diagnose_ex.h>
78*cdf0e10cSrcweir #include <typelib/typedescription.hxx>
79*cdf0e10cSrcweir #include <vcl/svapp.hxx>
80*cdf0e10cSrcweir #include <vcl/msgbox.hxx>
81*cdf0e10cSrcweir #include <vcl/stdtext.hxx>
82*cdf0e10cSrcweir #include <vcl/waitobj.hxx>
83*cdf0e10cSrcweir #include <vos/mutex.hxx>
84*cdf0e10cSrcweir 
85*cdf0e10cSrcweir #include <algorithm>
86*cdf0e10cSrcweir #include <functional>
87*cdf0e10cSrcweir //.........................................................................
88*cdf0e10cSrcweir namespace dbaui
89*cdf0e10cSrcweir {
90*cdf0e10cSrcweir //.........................................................................
91*cdf0e10cSrcweir using namespace ::dbtools;
92*cdf0e10cSrcweir using namespace com::sun::star::uno;
93*cdf0e10cSrcweir using namespace com::sun::star;
94*cdf0e10cSrcweir using namespace com::sun::star::ucb;
95*cdf0e10cSrcweir using namespace com::sun::star::task;
96*cdf0e10cSrcweir using namespace com::sun::star::sdbc;
97*cdf0e10cSrcweir using namespace com::sun::star::sdb;
98*cdf0e10cSrcweir using namespace com::sun::star::lang;
99*cdf0e10cSrcweir using namespace com::sun::star::beans;
100*cdf0e10cSrcweir using namespace com::sun::star::util;
101*cdf0e10cSrcweir using namespace com::sun::star::container;
102*cdf0e10cSrcweir using namespace com::sun::star::frame;
103*cdf0e10cSrcweir 
104*cdf0e10cSrcweir //-------------------------------------------------------------------------
105*cdf0e10cSrcweir namespace
106*cdf0e10cSrcweir {
107*cdf0e10cSrcweir 	sal_Bool implCheckItemType( SfxItemSet& _rSet, const sal_uInt16 _nId, const TypeId _nExpectedItemType )
108*cdf0e10cSrcweir 	{
109*cdf0e10cSrcweir 		sal_Bool bCorrectType = sal_False;
110*cdf0e10cSrcweir 
111*cdf0e10cSrcweir 		SfxItemPool* pPool = _rSet.GetPool();
112*cdf0e10cSrcweir 		DBG_ASSERT( pPool, "implCheckItemType: invalid item pool!" );
113*cdf0e10cSrcweir 		if ( pPool )
114*cdf0e10cSrcweir 		{
115*cdf0e10cSrcweir 			const SfxPoolItem& rDefItem = pPool->GetDefaultItem( _nId );
116*cdf0e10cSrcweir 			bCorrectType = rDefItem.IsA( _nExpectedItemType );
117*cdf0e10cSrcweir 		}
118*cdf0e10cSrcweir 		return bCorrectType;
119*cdf0e10cSrcweir 	}
120*cdf0e10cSrcweir 
121*cdf0e10cSrcweir 	void lcl_putProperty(const Reference< XPropertySet >& _rxSet, const ::rtl::OUString& _rName, const Any& _rValue)
122*cdf0e10cSrcweir 	{
123*cdf0e10cSrcweir 		try
124*cdf0e10cSrcweir 		{
125*cdf0e10cSrcweir 			if ( _rxSet.is() )
126*cdf0e10cSrcweir 				_rxSet->setPropertyValue(_rName, _rValue);
127*cdf0e10cSrcweir 		}
128*cdf0e10cSrcweir 		catch(Exception&)
129*cdf0e10cSrcweir 		{
130*cdf0e10cSrcweir 	#ifdef DBG_UTIL
131*cdf0e10cSrcweir 			::rtl::OString sMessage("ODbAdminDialog::implTranslateProperty: could not set the property ");
132*cdf0e10cSrcweir 			sMessage += ::rtl::OString(_rName.getStr(), _rName.getLength(), RTL_TEXTENCODING_ASCII_US);
133*cdf0e10cSrcweir 			sMessage += ::rtl::OString("!");
134*cdf0e10cSrcweir 			DBG_ERROR(sMessage.getStr());
135*cdf0e10cSrcweir 	#endif
136*cdf0e10cSrcweir 		}
137*cdf0e10cSrcweir 
138*cdf0e10cSrcweir 	}
139*cdf0e10cSrcweir 
140*cdf0e10cSrcweir 	String lcl_createHostWithPort(const SfxStringItem* _pHostName,const SfxInt32Item* _pPortNumber)
141*cdf0e10cSrcweir 	{
142*cdf0e10cSrcweir 		String sNewUrl;
143*cdf0e10cSrcweir 
144*cdf0e10cSrcweir 		if ( _pHostName && _pHostName->GetValue().Len() )
145*cdf0e10cSrcweir 			sNewUrl = _pHostName->GetValue();
146*cdf0e10cSrcweir 
147*cdf0e10cSrcweir 		if ( _pPortNumber )
148*cdf0e10cSrcweir 		{
149*cdf0e10cSrcweir 			sNewUrl += String::CreateFromAscii(":");
150*cdf0e10cSrcweir 			sNewUrl += String::CreateFromInt32(_pPortNumber->GetValue());
151*cdf0e10cSrcweir 		}
152*cdf0e10cSrcweir 
153*cdf0e10cSrcweir 		return sNewUrl;
154*cdf0e10cSrcweir 	}
155*cdf0e10cSrcweir }
156*cdf0e10cSrcweir 
157*cdf0e10cSrcweir 	//========================================================================
158*cdf0e10cSrcweir 	//= ODbDataSourceAdministrationHelper
159*cdf0e10cSrcweir 	//========================================================================
160*cdf0e10cSrcweir ODbDataSourceAdministrationHelper::ODbDataSourceAdministrationHelper(const Reference< XMultiServiceFactory >& _xORB,Window* _pParent,IItemSetHelper* _pItemSetHelper)
161*cdf0e10cSrcweir 		: m_xORB(_xORB)
162*cdf0e10cSrcweir 		, m_pParent(_pParent)
163*cdf0e10cSrcweir 		, m_pItemSetHelper(_pItemSetHelper)
164*cdf0e10cSrcweir {
165*cdf0e10cSrcweir 	/// initialize the property translation map
166*cdf0e10cSrcweir 	// direct properties of a data source
167*cdf0e10cSrcweir 	m_aDirectPropTranslator.insert(MapInt2String::value_type(DSID_CONNECTURL, PROPERTY_URL));
168*cdf0e10cSrcweir 	m_aDirectPropTranslator.insert(MapInt2String::value_type(DSID_NAME, PROPERTY_NAME));
169*cdf0e10cSrcweir 	m_aDirectPropTranslator.insert(MapInt2String::value_type(DSID_USER, PROPERTY_USER));
170*cdf0e10cSrcweir 	m_aDirectPropTranslator.insert(MapInt2String::value_type(DSID_PASSWORD, PROPERTY_PASSWORD));
171*cdf0e10cSrcweir 	m_aDirectPropTranslator.insert(MapInt2String::value_type(DSID_PASSWORDREQUIRED, PROPERTY_ISPASSWORDREQUIRED));
172*cdf0e10cSrcweir 	m_aDirectPropTranslator.insert(MapInt2String::value_type(DSID_TABLEFILTER, PROPERTY_TABLEFILTER));
173*cdf0e10cSrcweir 	m_aDirectPropTranslator.insert(MapInt2String::value_type(DSID_READONLY, PROPERTY_ISREADONLY));
174*cdf0e10cSrcweir 	m_aDirectPropTranslator.insert(MapInt2String::value_type(DSID_SUPPRESSVERSIONCL, PROPERTY_SUPPRESSVERSIONCL));
175*cdf0e10cSrcweir 
176*cdf0e10cSrcweir 	// implicit properties, to be found in the direct property "Info"
177*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_JDBCDRIVERCLASS, INFO_JDBCDRIVERCLASS));
178*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_TEXTFILEEXTENSION, INFO_TEXTFILEEXTENSION));
179*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_CHARSET, INFO_CHARSET));
180*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_TEXTFILEHEADER, INFO_TEXTFILEHEADER));
181*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_FIELDDELIMITER, INFO_FIELDDELIMITER));
182*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_TEXTDELIMITER, INFO_TEXTDELIMITER));
183*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_DECIMALDELIMITER, INFO_DECIMALDELIMITER));
184*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_THOUSANDSDELIMITER, INFO_THOUSANDSDELIMITER));
185*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_SHOWDELETEDROWS, INFO_SHOWDELETEDROWS));
186*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_ALLOWLONGTABLENAMES, INFO_ALLOWLONGTABLENAMES));
187*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_ADDITIONALOPTIONS, INFO_ADDITIONALOPTIONS));
188*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_SQL92CHECK, PROPERTY_ENABLESQL92CHECK));
189*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_AUTOINCREMENTVALUE, PROPERTY_AUTOINCREMENTCREATION));
190*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_AUTORETRIEVEVALUE, INFO_AUTORETRIEVEVALUE));
191*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_AUTORETRIEVEENABLED, INFO_AUTORETRIEVEENABLED));
192*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_APPEND_TABLE_ALIAS, INFO_APPEND_TABLE_ALIAS));
193*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_AS_BEFORE_CORRNAME, INFO_AS_BEFORE_CORRELATION_NAME ) );
194*cdf0e10cSrcweir     m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_CHECK_REQUIRED_FIELDS, INFO_FORMS_CHECK_REQUIRED_FIELDS ) );
195*cdf0e10cSrcweir     m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_ESCAPE_DATETIME, INFO_ESCAPE_DATETIME ) );
196*cdf0e10cSrcweir     m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_PRIMARY_KEY_SUPPORT, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrimaryKeySupport" ) ) ) );
197*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_PARAMETERNAMESUBST, INFO_PARAMETERNAMESUBST));
198*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_IGNOREDRIVER_PRIV, INFO_IGNOREDRIVER_PRIV));
199*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_BOOLEANCOMPARISON, PROPERTY_BOOLEANCOMPARISONMODE));
200*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_ENABLEOUTERJOIN, PROPERTY_ENABLEOUTERJOIN));
201*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_CATALOG, PROPERTY_USECATALOGINSELECT));
202*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_SCHEMA, PROPERTY_USESCHEMAINSELECT));
203*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_INDEXAPPENDIX, ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AddIndexAppendix"))));
204*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_DOSLINEENDS, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PreferDosLikeLineEnds" ) ) ) );
205*cdf0e10cSrcweir     m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_CONN_SOCKET, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LocalSocket" ) ) ) );
206*cdf0e10cSrcweir     m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_NAMED_PIPE, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "NamedPipe" ) ) ) );
207*cdf0e10cSrcweir     m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_RESPECTRESULTSETTYPE, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "RespectDriverResultSetType" ) ) ) );
208*cdf0e10cSrcweir     m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_MAX_ROW_SCAN, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "MaxRowScan" ) ) ) );
209*cdf0e10cSrcweir 
210*cdf0e10cSrcweir 	// special settings for adabas
211*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_CONN_SHUTSERVICE, ::rtl::OUString::createFromAscii("ShutdownDatabase")));
212*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_CONN_DATAINC, ::rtl::OUString::createFromAscii("DataCacheSizeIncrement")));
213*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_CONN_CACHESIZE, ::rtl::OUString::createFromAscii("DataCacheSize")));
214*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_CONN_CTRLUSER, ::rtl::OUString::createFromAscii("ControlUser")));
215*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_CONN_CTRLPWD, ::rtl::OUString::createFromAscii("ControlPassword")));
216*cdf0e10cSrcweir 
217*cdf0e10cSrcweir 	// extra settings for odbc
218*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_USECATALOG, INFO_USECATALOG));
219*cdf0e10cSrcweir 	// extra settings for a ldap address book
220*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_CONN_LDAP_BASEDN, INFO_CONN_LDAP_BASEDN));
221*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_CONN_LDAP_ROWCOUNT, INFO_CONN_LDAP_ROWCOUNT));
222*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_CONN_LDAP_USESSL, ::rtl::OUString::createFromAscii("UseSSL")));
223*cdf0e10cSrcweir 	m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_DOCUMENT_URL, PROPERTY_URL));
224*cdf0e10cSrcweir 
225*cdf0e10cSrcweir     // oracle
226*cdf0e10cSrcweir     m_aIndirectPropTranslator.insert(MapInt2String::value_type(DSID_IGNORECURRENCY, ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("IgnoreCurrency"))));
227*cdf0e10cSrcweir 
228*cdf0e10cSrcweir 	try
229*cdf0e10cSrcweir 	{
230*cdf0e10cSrcweir 		m_xDatabaseContext = Reference< XNameAccess >(m_xORB->createInstance(SERVICE_SDB_DATABASECONTEXT), UNO_QUERY);
231*cdf0e10cSrcweir 		m_xDynamicContext.set(m_xDatabaseContext,UNO_QUERY);
232*cdf0e10cSrcweir 	}
233*cdf0e10cSrcweir 	catch(Exception&)
234*cdf0e10cSrcweir 	{
235*cdf0e10cSrcweir 	}
236*cdf0e10cSrcweir 
237*cdf0e10cSrcweir 	if ( !m_xDatabaseContext.is() )
238*cdf0e10cSrcweir 	{
239*cdf0e10cSrcweir 		ShowServiceNotAvailableError(_pParent->GetParent(), String(SERVICE_SDB_DATABASECONTEXT), sal_True);
240*cdf0e10cSrcweir 	}
241*cdf0e10cSrcweir 
242*cdf0e10cSrcweir 	DBG_ASSERT(m_xDynamicContext.is(), "ODbAdminDialog::ODbAdminDialog : no XNamingService interface !");
243*cdf0e10cSrcweir }
244*cdf0e10cSrcweir 	//-------------------------------------------------------------------------
245*cdf0e10cSrcweir sal_Bool ODbDataSourceAdministrationHelper::getCurrentSettings(Sequence< PropertyValue >& _rDriverParam)
246*cdf0e10cSrcweir {
247*cdf0e10cSrcweir 	DBG_ASSERT(m_pItemSetHelper->getOutputSet(), "ODbDataSourceAdministrationHelper::getCurrentSettings : not to be called without an example set!");
248*cdf0e10cSrcweir 	if (!m_pItemSetHelper->getOutputSet())
249*cdf0e10cSrcweir 		return sal_False;
250*cdf0e10cSrcweir 
251*cdf0e10cSrcweir 	::std::vector< PropertyValue > aReturn;
252*cdf0e10cSrcweir 		// collecting this in a vector because it has a push_back, in opposite to sequences
253*cdf0e10cSrcweir 
254*cdf0e10cSrcweir 	// user: DSID_USER -> "user"
255*cdf0e10cSrcweir 	SFX_ITEMSET_GET(*m_pItemSetHelper->getOutputSet(), pUser, SfxStringItem, DSID_USER, sal_True);
256*cdf0e10cSrcweir 	if (pUser && pUser->GetValue().Len())
257*cdf0e10cSrcweir 		aReturn.push_back(
258*cdf0e10cSrcweir 			PropertyValue(	::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("user")), 0,
259*cdf0e10cSrcweir 							makeAny(::rtl::OUString(pUser->GetValue())), PropertyState_DIRECT_VALUE));
260*cdf0e10cSrcweir 
261*cdf0e10cSrcweir 	// check if the connection type requires a password
262*cdf0e10cSrcweir 	if (hasAuthentication(*m_pItemSetHelper->getOutputSet()))
263*cdf0e10cSrcweir 	{
264*cdf0e10cSrcweir 		// password: DSID_PASSWORD -> "password"
265*cdf0e10cSrcweir 		SFX_ITEMSET_GET(*m_pItemSetHelper->getOutputSet(), pPassword, SfxStringItem, DSID_PASSWORD, sal_True);
266*cdf0e10cSrcweir 		String sPassword = pPassword ? pPassword->GetValue() : String();
267*cdf0e10cSrcweir 		SFX_ITEMSET_GET(*m_pItemSetHelper->getOutputSet(), pPasswordRequired, SfxBoolItem, DSID_PASSWORDREQUIRED, sal_True);
268*cdf0e10cSrcweir 		// if the set does not contain a password, but the item set says it requires one, ask the user
269*cdf0e10cSrcweir 		if ((!pPassword || !pPassword->GetValue().Len()) && (pPasswordRequired && pPasswordRequired->GetValue()))
270*cdf0e10cSrcweir 		{
271*cdf0e10cSrcweir 			SFX_ITEMSET_GET(*m_pItemSetHelper->getOutputSet(), pName, SfxStringItem, DSID_NAME, sal_True);
272*cdf0e10cSrcweir 
273*cdf0e10cSrcweir             Reference< XModel > xModel( getDataSourceOrModel( m_xDatasource ), UNO_QUERY_THROW );
274*cdf0e10cSrcweir             ::comphelper::NamedValueCollection aArgs( xModel->getArgs() );
275*cdf0e10cSrcweir             Reference< XInteractionHandler > xHandler( aArgs.getOrDefault( "InteractionHandler", Reference< XInteractionHandler >() ) );
276*cdf0e10cSrcweir 
277*cdf0e10cSrcweir             if ( !xHandler.is() )
278*cdf0e10cSrcweir             {
279*cdf0e10cSrcweir                 // instantiate the default SDB interaction handler
280*cdf0e10cSrcweir                 xHandler = Reference< XInteractionHandler >( m_xORB->createInstance( SERVICE_TASK_INTERACTION_HANDLER ), UNO_QUERY );
281*cdf0e10cSrcweir                 if ( !xHandler.is() )
282*cdf0e10cSrcweir 				    ShowServiceNotAvailableError(m_pParent->GetParent(), String(SERVICE_TASK_INTERACTION_HANDLER), sal_True);
283*cdf0e10cSrcweir             }
284*cdf0e10cSrcweir 
285*cdf0e10cSrcweir             String sName = pName ? pName->GetValue() : String();
286*cdf0e10cSrcweir             String sLoginRequest(ModuleRes(STR_ENTER_CONNECTION_PASSWORD));
287*cdf0e10cSrcweir             ::rtl::OUString sTemp = sName;
288*cdf0e10cSrcweir             sName = ::dbaui::getStrippedDatabaseName(NULL,sTemp);
289*cdf0e10cSrcweir             if ( sName.Len() )
290*cdf0e10cSrcweir                 sLoginRequest.SearchAndReplaceAscii("$name$", sName);
291*cdf0e10cSrcweir             else
292*cdf0e10cSrcweir             {
293*cdf0e10cSrcweir                 sLoginRequest.SearchAndReplaceAscii("\"$name$\"", String());
294*cdf0e10cSrcweir                 sLoginRequest.SearchAndReplaceAscii("$name$", String()); // just to be sure that in other languages the string will be deleted
295*cdf0e10cSrcweir             }
296*cdf0e10cSrcweir 
297*cdf0e10cSrcweir             // the request
298*cdf0e10cSrcweir             AuthenticationRequest aRequest;
299*cdf0e10cSrcweir             aRequest.ServerName = sName;
300*cdf0e10cSrcweir             aRequest.Diagnostic = sLoginRequest;
301*cdf0e10cSrcweir             aRequest.HasRealm   = aRequest.HasAccount = sal_False;
302*cdf0e10cSrcweir             // aRequest.Realm
303*cdf0e10cSrcweir             aRequest.HasUserName = pUser != 0;
304*cdf0e10cSrcweir             aRequest.UserName    = pUser ? rtl::OUString(pUser->GetValue()) : ::rtl::OUString();
305*cdf0e10cSrcweir             aRequest.HasPassword = sal_True;
306*cdf0e10cSrcweir             //aRequest.Password
307*cdf0e10cSrcweir             aRequest.HasAccount  = sal_False;
308*cdf0e10cSrcweir             // aRequest.Account
309*cdf0e10cSrcweir 
310*cdf0e10cSrcweir             comphelper::OInteractionRequest* pRequest = new comphelper::OInteractionRequest(makeAny(aRequest));
311*cdf0e10cSrcweir             uno::Reference< XInteractionRequest > xRequest(pRequest);
312*cdf0e10cSrcweir 
313*cdf0e10cSrcweir             // build an interaction request
314*cdf0e10cSrcweir             // two continuations (Ok and Cancel)
315*cdf0e10cSrcweir             ::rtl::Reference< comphelper::OInteractionAbort > pAbort = new comphelper::OInteractionAbort;
316*cdf0e10cSrcweir             ::rtl::Reference< dbaccess::OAuthenticationContinuation > pAuthenticate = new dbaccess::OAuthenticationContinuation;
317*cdf0e10cSrcweir             pAuthenticate->setCanChangeUserName( sal_False );
318*cdf0e10cSrcweir             pAuthenticate->setRememberPassword( RememberAuthentication_SESSION );
319*cdf0e10cSrcweir 
320*cdf0e10cSrcweir             // some knittings
321*cdf0e10cSrcweir             pRequest->addContinuation(pAbort.get());
322*cdf0e10cSrcweir             pRequest->addContinuation(pAuthenticate.get());
323*cdf0e10cSrcweir 
324*cdf0e10cSrcweir             // handle the request
325*cdf0e10cSrcweir             try
326*cdf0e10cSrcweir             {
327*cdf0e10cSrcweir                 ::vos::OGuard aSolarGuard(Application::GetSolarMutex());
328*cdf0e10cSrcweir                 // release the mutex when calling the handler, it may need to lock the SolarMutex
329*cdf0e10cSrcweir                 xHandler->handle(xRequest);
330*cdf0e10cSrcweir             }
331*cdf0e10cSrcweir             catch(Exception&)
332*cdf0e10cSrcweir             {
333*cdf0e10cSrcweir                 DBG_UNHANDLED_EXCEPTION();
334*cdf0e10cSrcweir             }
335*cdf0e10cSrcweir             if (!pAuthenticate->wasSelected())
336*cdf0e10cSrcweir                 return sal_False;
337*cdf0e10cSrcweir 
338*cdf0e10cSrcweir             sPassword = pAuthenticate->getPassword();
339*cdf0e10cSrcweir             if (pAuthenticate->getRememberPassword())
340*cdf0e10cSrcweir                 m_pItemSetHelper->getWriteOutputSet()->Put(SfxStringItem(DSID_PASSWORD, sPassword));
341*cdf0e10cSrcweir 		}
342*cdf0e10cSrcweir 
343*cdf0e10cSrcweir         if (sPassword.Len())
344*cdf0e10cSrcweir 			aReturn.push_back(
345*cdf0e10cSrcweir 				PropertyValue(	::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("password")), 0,
346*cdf0e10cSrcweir 								makeAny(::rtl::OUString(sPassword)), PropertyState_DIRECT_VALUE));
347*cdf0e10cSrcweir 	}
348*cdf0e10cSrcweir 
349*cdf0e10cSrcweir     if ( !aReturn.empty() )
350*cdf0e10cSrcweir 	    _rDriverParam = Sequence< PropertyValue >(&(*aReturn.begin()), aReturn.size());
351*cdf0e10cSrcweir 
352*cdf0e10cSrcweir 	// append all the other stuff (charset etc.)
353*cdf0e10cSrcweir 	fillDatasourceInfo(*m_pItemSetHelper->getOutputSet(), _rDriverParam);
354*cdf0e10cSrcweir 
355*cdf0e10cSrcweir 	return sal_True;
356*cdf0e10cSrcweir }
357*cdf0e10cSrcweir //-------------------------------------------------------------------------
358*cdf0e10cSrcweir void ODbDataSourceAdministrationHelper::successfullyConnected()
359*cdf0e10cSrcweir {
360*cdf0e10cSrcweir 	DBG_ASSERT(m_pItemSetHelper->getOutputSet(), "ODbDataSourceAdministrationHelper::successfullyConnected: not to be called without an example set!");
361*cdf0e10cSrcweir 	if (!m_pItemSetHelper->getOutputSet())
362*cdf0e10cSrcweir 		return;
363*cdf0e10cSrcweir 
364*cdf0e10cSrcweir 	if (hasAuthentication(*m_pItemSetHelper->getOutputSet()))
365*cdf0e10cSrcweir 	{
366*cdf0e10cSrcweir 		SFX_ITEMSET_GET(*m_pItemSetHelper->getOutputSet(), pPassword, SfxStringItem, DSID_PASSWORD, sal_True);
367*cdf0e10cSrcweir 		if (pPassword && (0 != pPassword->GetValue().Len()))
368*cdf0e10cSrcweir 		{
369*cdf0e10cSrcweir 			::rtl::OUString sPassword = pPassword->GetValue();
370*cdf0e10cSrcweir 
371*cdf0e10cSrcweir 			Reference< XPropertySet > xCurrentDatasource = getCurrentDataSource();
372*cdf0e10cSrcweir 			lcl_putProperty(xCurrentDatasource,m_aDirectPropTranslator[DSID_PASSWORD], makeAny(sPassword));
373*cdf0e10cSrcweir 		}
374*cdf0e10cSrcweir 	}
375*cdf0e10cSrcweir }
376*cdf0e10cSrcweir //-------------------------------------------------------------------------
377*cdf0e10cSrcweir void ODbDataSourceAdministrationHelper::clearPassword()
378*cdf0e10cSrcweir {
379*cdf0e10cSrcweir 	if (m_pItemSetHelper->getWriteOutputSet())
380*cdf0e10cSrcweir 		m_pItemSetHelper->getWriteOutputSet()->ClearItem(DSID_PASSWORD);
381*cdf0e10cSrcweir }
382*cdf0e10cSrcweir // -----------------------------------------------------------------------------
383*cdf0e10cSrcweir ::std::pair< Reference<XConnection>,sal_Bool> ODbDataSourceAdministrationHelper::createConnection()
384*cdf0e10cSrcweir {
385*cdf0e10cSrcweir 	::std::pair< Reference<XConnection>,sal_Bool> aRet;
386*cdf0e10cSrcweir 	aRet.second = sal_False;
387*cdf0e10cSrcweir 	Sequence< PropertyValue > aConnectionParams;
388*cdf0e10cSrcweir 	if ( getCurrentSettings(aConnectionParams) )
389*cdf0e10cSrcweir 	{
390*cdf0e10cSrcweir 		// the current DSN
391*cdf0e10cSrcweir 		// fill the table list with this connection information
392*cdf0e10cSrcweir 		SQLExceptionInfo aErrorInfo;
393*cdf0e10cSrcweir 		try
394*cdf0e10cSrcweir 		{
395*cdf0e10cSrcweir 			WaitObject aWaitCursor(m_pParent);
396*cdf0e10cSrcweir 			aRet.first = getDriver()->connect(getConnectionURL(), aConnectionParams);
397*cdf0e10cSrcweir 			aRet.second = sal_True;
398*cdf0e10cSrcweir 		}
399*cdf0e10cSrcweir 		catch (SQLContext& e) { aErrorInfo = SQLExceptionInfo(e); }
400*cdf0e10cSrcweir 		catch (SQLWarning& e) { aErrorInfo = SQLExceptionInfo(e); }
401*cdf0e10cSrcweir 		catch (SQLException& e) { aErrorInfo = SQLExceptionInfo(e); }
402*cdf0e10cSrcweir 
403*cdf0e10cSrcweir 		showError(aErrorInfo,m_pParent,getORB());
404*cdf0e10cSrcweir 	}
405*cdf0e10cSrcweir 	if ( aRet.first.is() )
406*cdf0e10cSrcweir 		successfullyConnected();// notify the admindlg to save the password
407*cdf0e10cSrcweir 
408*cdf0e10cSrcweir 	return aRet;
409*cdf0e10cSrcweir }
410*cdf0e10cSrcweir // -----------------------------------------------------------------------------
411*cdf0e10cSrcweir Reference< XDriver > ODbDataSourceAdministrationHelper::getDriver()
412*cdf0e10cSrcweir {
413*cdf0e10cSrcweir     return getDriver(getConnectionURL());
414*cdf0e10cSrcweir }
415*cdf0e10cSrcweir // -----------------------------------------------------------------------------
416*cdf0e10cSrcweir Reference< XDriver > ODbDataSourceAdministrationHelper::getDriver(const ::rtl::OUString& _sURL)
417*cdf0e10cSrcweir {
418*cdf0e10cSrcweir 	// get the global DriverManager
419*cdf0e10cSrcweir 	Reference< XDriverAccess > xDriverManager;
420*cdf0e10cSrcweir 	String sCurrentActionError = String(ModuleRes(STR_COULDNOTCREATE_DRIVERMANAGER));
421*cdf0e10cSrcweir 		// in case an error occures
422*cdf0e10cSrcweir 	sCurrentActionError.SearchAndReplaceAscii("#servicename#", (::rtl::OUString)SERVICE_SDBC_CONNECTIONPOOL);
423*cdf0e10cSrcweir 	try
424*cdf0e10cSrcweir 	{
425*cdf0e10cSrcweir 		xDriverManager = Reference< XDriverAccess >(getORB()->createInstance(SERVICE_SDBC_CONNECTIONPOOL), UNO_QUERY);
426*cdf0e10cSrcweir 		DBG_ASSERT(xDriverManager.is(), "ODbDataSourceAdministrationHelper::getDriver: could not instantiate the driver manager, or it does not provide the necessary interface!");
427*cdf0e10cSrcweir 	}
428*cdf0e10cSrcweir 	catch (Exception& e)
429*cdf0e10cSrcweir 	{
430*cdf0e10cSrcweir 		// wrap the exception into an SQLException
431*cdf0e10cSrcweir 		SQLException aSQLWrapper(e.Message, getORB(), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("S1000")), 0, Any());
432*cdf0e10cSrcweir 		throw SQLException(sCurrentActionError, getORB(), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("S1000")), 0, makeAny(aSQLWrapper));
433*cdf0e10cSrcweir 	}
434*cdf0e10cSrcweir 	if (!xDriverManager.is())
435*cdf0e10cSrcweir 		throw SQLException(sCurrentActionError, getORB(), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("S1000")), 0, Any());
436*cdf0e10cSrcweir 
437*cdf0e10cSrcweir 
438*cdf0e10cSrcweir 	Reference< XDriver > xDriver = xDriverManager->getDriverByURL(_sURL);
439*cdf0e10cSrcweir 	if (!xDriver.is())
440*cdf0e10cSrcweir 	{
441*cdf0e10cSrcweir 		sCurrentActionError = String(ModuleRes(STR_NOREGISTEREDDRIVER));
442*cdf0e10cSrcweir 		sCurrentActionError.SearchAndReplaceAscii("#connurl#", _sURL);
443*cdf0e10cSrcweir 		// will be caught and translated into an SQLContext exception
444*cdf0e10cSrcweir 		throw SQLException(sCurrentActionError, getORB(), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("S1000")), 0, Any());
445*cdf0e10cSrcweir 	}
446*cdf0e10cSrcweir 	return xDriver;
447*cdf0e10cSrcweir }
448*cdf0e10cSrcweir 
449*cdf0e10cSrcweir // -----------------------------------------------------------------------------
450*cdf0e10cSrcweir Reference< XPropertySet > ODbDataSourceAdministrationHelper::getCurrentDataSource()
451*cdf0e10cSrcweir {
452*cdf0e10cSrcweir 	if ( !m_xDatasource.is() )
453*cdf0e10cSrcweir 	{
454*cdf0e10cSrcweir 		Reference<XInterface> xIn(m_aDataSourceOrName,UNO_QUERY);
455*cdf0e10cSrcweir 		if ( !xIn.is() )
456*cdf0e10cSrcweir 		{
457*cdf0e10cSrcweir 			::rtl::OUString sCurrentDatasource;
458*cdf0e10cSrcweir 			m_aDataSourceOrName >>= sCurrentDatasource;
459*cdf0e10cSrcweir 			OSL_ENSURE(sCurrentDatasource.getLength(),"No datasource name given!");
460*cdf0e10cSrcweir 			try
461*cdf0e10cSrcweir 			{
462*cdf0e10cSrcweir 				if ( m_xDatabaseContext.is() )
463*cdf0e10cSrcweir 					m_xDatasource.set(m_xDatabaseContext->getByName(sCurrentDatasource),UNO_QUERY);
464*cdf0e10cSrcweir 				xIn = m_xDatasource;
465*cdf0e10cSrcweir 			}
466*cdf0e10cSrcweir 			catch(const Exception&)
467*cdf0e10cSrcweir 			{
468*cdf0e10cSrcweir 			}
469*cdf0e10cSrcweir 		}
470*cdf0e10cSrcweir     	m_xModel.set(getDataSourceOrModel(xIn),UNO_QUERY);
471*cdf0e10cSrcweir 		if ( m_xModel.is() )
472*cdf0e10cSrcweir 	    	m_xDatasource.set(xIn,UNO_QUERY);
473*cdf0e10cSrcweir 		else
474*cdf0e10cSrcweir 		{
475*cdf0e10cSrcweir     		m_xDatasource.set(getDataSourceOrModel(xIn),UNO_QUERY);
476*cdf0e10cSrcweir 	    	m_xModel.set(xIn,UNO_QUERY);
477*cdf0e10cSrcweir 		}
478*cdf0e10cSrcweir 	}
479*cdf0e10cSrcweir 
480*cdf0e10cSrcweir 
481*cdf0e10cSrcweir 	DBG_ASSERT(m_xDatasource.is(), "ODbDataSourceAdministrationHelper::getCurrentDataSource: no data source!");
482*cdf0e10cSrcweir 	return m_xDatasource;
483*cdf0e10cSrcweir }
484*cdf0e10cSrcweir //-------------------------------------------------------------------------
485*cdf0e10cSrcweir ::rtl::OUString ODbDataSourceAdministrationHelper::getDatasourceType( const SfxItemSet& _rSet )
486*cdf0e10cSrcweir {
487*cdf0e10cSrcweir 	SFX_ITEMSET_GET( _rSet, pConnectURL, SfxStringItem, DSID_CONNECTURL, sal_True );
488*cdf0e10cSrcweir 	DBG_ASSERT( pConnectURL , "ODbDataSourceAdministrationHelper::getDatasourceType: invalid items in the source set!" );
489*cdf0e10cSrcweir     SFX_ITEMSET_GET(_rSet, pTypeCollection, DbuTypeCollectionItem, DSID_TYPECOLLECTION, sal_True);
490*cdf0e10cSrcweir 	DBG_ASSERT(pTypeCollection, "ODbDataSourceAdministrationHelper::getDatasourceType: invalid items in the source set!");
491*cdf0e10cSrcweir 	::dbaccess::ODsnTypeCollection* pCollection = pTypeCollection->getCollection();
492*cdf0e10cSrcweir 	return pCollection->getType(pConnectURL->GetValue());
493*cdf0e10cSrcweir }
494*cdf0e10cSrcweir 
495*cdf0e10cSrcweir //-------------------------------------------------------------------------
496*cdf0e10cSrcweir sal_Bool ODbDataSourceAdministrationHelper::hasAuthentication(const SfxItemSet& _rSet) const
497*cdf0e10cSrcweir {
498*cdf0e10cSrcweir     return DataSourceMetaData::getAuthentication( getDatasourceType( _rSet ) ) != AuthNone;
499*cdf0e10cSrcweir }
500*cdf0e10cSrcweir // -----------------------------------------------------------------------------
501*cdf0e10cSrcweir String ODbDataSourceAdministrationHelper::getConnectionURL() const
502*cdf0e10cSrcweir {
503*cdf0e10cSrcweir 	String sNewUrl;
504*cdf0e10cSrcweir 
505*cdf0e10cSrcweir 	::rtl::OUString eType = getDatasourceType(*m_pItemSetHelper->getOutputSet());
506*cdf0e10cSrcweir 
507*cdf0e10cSrcweir 	SFX_ITEMSET_GET(*m_pItemSetHelper->getOutputSet(), pUrlItem, SfxStringItem, DSID_CONNECTURL, sal_True);
508*cdf0e10cSrcweir 	SFX_ITEMSET_GET(*m_pItemSetHelper->getOutputSet(), pTypeCollection, DbuTypeCollectionItem, DSID_TYPECOLLECTION, sal_True);
509*cdf0e10cSrcweir 
510*cdf0e10cSrcweir 	OSL_ENSURE(pUrlItem,"Connection URL is NULL. -> GPF!");
511*cdf0e10cSrcweir 	DBG_ASSERT(pTypeCollection, "ODbDataSourceAdministrationHelper::getDatasourceType: invalid items in the source set!");
512*cdf0e10cSrcweir 	::dbaccess::ODsnTypeCollection* pCollection = pTypeCollection->getCollection();
513*cdf0e10cSrcweir 	DBG_ASSERT(pCollection, "ODbDataSourceAdministrationHelper::getDatasourceType: invalid type collection!");
514*cdf0e10cSrcweir 
515*cdf0e10cSrcweir 	switch( pCollection->determineType(eType) )
516*cdf0e10cSrcweir 	{
517*cdf0e10cSrcweir 		case  ::dbaccess::DST_DBASE:
518*cdf0e10cSrcweir 		case  ::dbaccess::DST_FLAT:
519*cdf0e10cSrcweir 		case  ::dbaccess::DST_CALC:
520*cdf0e10cSrcweir 			break;
521*cdf0e10cSrcweir 		case  ::dbaccess::DST_ADABAS:
522*cdf0e10cSrcweir 			{
523*cdf0e10cSrcweir 				SFX_ITEMSET_GET(*m_pItemSetHelper->getOutputSet(), pHostName, SfxStringItem, DSID_CONN_HOSTNAME, sal_True);
524*cdf0e10cSrcweir 				sNewUrl = lcl_createHostWithPort(pHostName,NULL);
525*cdf0e10cSrcweir 				String sUrl = pCollection->cutPrefix(pUrlItem->GetValue());
526*cdf0e10cSrcweir 				if ( sUrl.GetTokenCount(':') == 1 )
527*cdf0e10cSrcweir 					sNewUrl += String::CreateFromAscii(":");
528*cdf0e10cSrcweir 
529*cdf0e10cSrcweir 				sNewUrl += sUrl;
530*cdf0e10cSrcweir 			}
531*cdf0e10cSrcweir 			break;
532*cdf0e10cSrcweir 		case  ::dbaccess::DST_MSACCESS:
533*cdf0e10cSrcweir         case  ::dbaccess::DST_MSACCESS_2007:
534*cdf0e10cSrcweir 			{
535*cdf0e10cSrcweir 				::rtl::OUString sFileName = pCollection->cutPrefix(pUrlItem->GetValue());
536*cdf0e10cSrcweir 				::rtl::OUString sNewFileName;
537*cdf0e10cSrcweir 				if ( ::osl::FileBase::getSystemPathFromFileURL( sFileName, sNewFileName ) == ::osl::FileBase::E_None )
538*cdf0e10cSrcweir 				{
539*cdf0e10cSrcweir 					sNewUrl += String(sNewFileName);
540*cdf0e10cSrcweir 				}
541*cdf0e10cSrcweir 			}
542*cdf0e10cSrcweir             break;
543*cdf0e10cSrcweir         case  ::dbaccess::DST_MYSQL_NATIVE:
544*cdf0e10cSrcweir 		case  ::dbaccess::DST_MYSQL_JDBC:
545*cdf0e10cSrcweir 			{
546*cdf0e10cSrcweir 				SFX_ITEMSET_GET(*m_pItemSetHelper->getOutputSet(), pHostName, SfxStringItem, DSID_CONN_HOSTNAME, sal_True);
547*cdf0e10cSrcweir 				SFX_ITEMSET_GET(*m_pItemSetHelper->getOutputSet(), pPortNumber, SfxInt32Item, DSID_MYSQL_PORTNUMBER, sal_True);
548*cdf0e10cSrcweir 				SFX_ITEMSET_GET(*m_pItemSetHelper->getOutputSet(), pDatabaseName, SfxStringItem, DSID_DATABASENAME, sal_True);
549*cdf0e10cSrcweir 				sNewUrl = lcl_createHostWithPort(pHostName,pPortNumber);
550*cdf0e10cSrcweir                 String sDatabaseName = pDatabaseName ? pDatabaseName->GetValue() : String();
551*cdf0e10cSrcweir                 if ( !sDatabaseName.Len() && pUrlItem )
552*cdf0e10cSrcweir                     sDatabaseName = pCollection->cutPrefix( pUrlItem->GetValue() );
553*cdf0e10cSrcweir                     // TODO: what's that? Why is the database name transported via the URL Item?
554*cdf0e10cSrcweir                     // Huh? Anybody there?
555*cdf0e10cSrcweir 					// OJ: It is needed when the connection properties are changed. There the URL is used for every type.
556*cdf0e10cSrcweir 
557*cdf0e10cSrcweir                 if ( sDatabaseName.Len() )
558*cdf0e10cSrcweir                 {
559*cdf0e10cSrcweir 					sNewUrl += String::CreateFromAscii("/");
560*cdf0e10cSrcweir 					sNewUrl += sDatabaseName;
561*cdf0e10cSrcweir                 }
562*cdf0e10cSrcweir 			}
563*cdf0e10cSrcweir 			break;
564*cdf0e10cSrcweir 		case  ::dbaccess::DST_ORACLE_JDBC:
565*cdf0e10cSrcweir 			{
566*cdf0e10cSrcweir 				SFX_ITEMSET_GET(*m_pItemSetHelper->getOutputSet(), pHostName, SfxStringItem, DSID_CONN_HOSTNAME, sal_True);
567*cdf0e10cSrcweir 				SFX_ITEMSET_GET(*m_pItemSetHelper->getOutputSet(), pPortNumber, SfxInt32Item, DSID_ORACLE_PORTNUMBER, sal_True);
568*cdf0e10cSrcweir 				SFX_ITEMSET_GET(*m_pItemSetHelper->getOutputSet(), pDatabaseName, SfxStringItem, DSID_DATABASENAME, sal_True);
569*cdf0e10cSrcweir                 if ( pHostName && pHostName->GetValue().Len() )
570*cdf0e10cSrcweir                 {
571*cdf0e10cSrcweir 				    sNewUrl = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("@"));
572*cdf0e10cSrcweir 				    sNewUrl += lcl_createHostWithPort(pHostName,pPortNumber);
573*cdf0e10cSrcweir 				    String sDatabaseName = pDatabaseName ? pDatabaseName->GetValue() : String();
574*cdf0e10cSrcweir                     if ( !sDatabaseName.Len() && pUrlItem )
575*cdf0e10cSrcweir                         sDatabaseName = pCollection->cutPrefix( pUrlItem->GetValue() );
576*cdf0e10cSrcweir 				    if ( sDatabaseName.Len() )
577*cdf0e10cSrcweir 				    {
578*cdf0e10cSrcweir 					    sNewUrl += String::CreateFromAscii(":");
579*cdf0e10cSrcweir 					    sNewUrl += sDatabaseName;
580*cdf0e10cSrcweir 				    }
581*cdf0e10cSrcweir                 }
582*cdf0e10cSrcweir                 else
583*cdf0e10cSrcweir                 { // here someone entered a JDBC url which looks like oracle, so we have to use the url property
584*cdf0e10cSrcweir 
585*cdf0e10cSrcweir                 }
586*cdf0e10cSrcweir 			}
587*cdf0e10cSrcweir 			break;
588*cdf0e10cSrcweir 		case  ::dbaccess::DST_LDAP:
589*cdf0e10cSrcweir 			{
590*cdf0e10cSrcweir 				//	SFX_ITEMSET_GET(*m_pItemSetHelper->getOutputSet(), pHostName, SfxStringItem, DSID_CONN_HOSTNAME, sal_True);
591*cdf0e10cSrcweir 				SFX_ITEMSET_GET(*m_pItemSetHelper->getOutputSet(), pPortNumber, SfxInt32Item, DSID_CONN_LDAP_PORTNUMBER, sal_True);
592*cdf0e10cSrcweir 				sNewUrl = pCollection->cutPrefix(pUrlItem->GetValue());
593*cdf0e10cSrcweir 				sNewUrl += lcl_createHostWithPort(NULL,pPortNumber);
594*cdf0e10cSrcweir 			}
595*cdf0e10cSrcweir 			break;
596*cdf0e10cSrcweir 		case  ::dbaccess::DST_JDBC:
597*cdf0e10cSrcweir 			// run through
598*cdf0e10cSrcweir 		default:
599*cdf0e10cSrcweir 			break;
600*cdf0e10cSrcweir 	}
601*cdf0e10cSrcweir 	if ( sNewUrl.Len() )
602*cdf0e10cSrcweir 	{
603*cdf0e10cSrcweir 		String sUrl = pCollection->getPrefix(eType);
604*cdf0e10cSrcweir 		sUrl += sNewUrl;
605*cdf0e10cSrcweir 		sNewUrl = sUrl;
606*cdf0e10cSrcweir 	}
607*cdf0e10cSrcweir 	else
608*cdf0e10cSrcweir 		sNewUrl = pUrlItem->GetValue();
609*cdf0e10cSrcweir 
610*cdf0e10cSrcweir 	return sNewUrl;
611*cdf0e10cSrcweir }
612*cdf0e10cSrcweir //-------------------------------------------------------------------------
613*cdf0e10cSrcweir struct PropertyValueLess
614*cdf0e10cSrcweir {
615*cdf0e10cSrcweir 	bool operator() (const PropertyValue& x, const PropertyValue& y) const
616*cdf0e10cSrcweir 		{ return x.Name < y.Name ? true : false; }		// construct prevents a MSVC6 warning
617*cdf0e10cSrcweir };
618*cdf0e10cSrcweir DECLARE_STL_SET( PropertyValue, PropertyValueLess, PropertyValueSet);
619*cdf0e10cSrcweir 
620*cdf0e10cSrcweir //........................................................................
621*cdf0e10cSrcweir void ODbDataSourceAdministrationHelper::translateProperties(const Reference< XPropertySet >& _rxSource, SfxItemSet& _rDest)
622*cdf0e10cSrcweir {
623*cdf0e10cSrcweir 	::rtl::OUString sNewConnectURL, sName, sUid, sPwd;
624*cdf0e10cSrcweir 	Sequence< ::rtl::OUString > aTableFitler;
625*cdf0e10cSrcweir 
626*cdf0e10cSrcweir 	if (_rxSource.is())
627*cdf0e10cSrcweir 	{
628*cdf0e10cSrcweir 		for	(	ConstMapInt2StringIterator aDirect = m_aDirectPropTranslator.begin();
629*cdf0e10cSrcweir 				aDirect != m_aDirectPropTranslator.end();
630*cdf0e10cSrcweir 				++aDirect
631*cdf0e10cSrcweir 			)
632*cdf0e10cSrcweir 		{
633*cdf0e10cSrcweir 			// get the property value
634*cdf0e10cSrcweir 			Any aValue;
635*cdf0e10cSrcweir 			try
636*cdf0e10cSrcweir 			{
637*cdf0e10cSrcweir 				aValue = _rxSource->getPropertyValue(aDirect->second);
638*cdf0e10cSrcweir 			}
639*cdf0e10cSrcweir 			catch(Exception&)
640*cdf0e10cSrcweir 			{
641*cdf0e10cSrcweir #ifdef DBG_UTIL
642*cdf0e10cSrcweir 				::rtl::OString aMessage("ODbDataSourceAdministrationHelper::translateProperties: could not extract the property ");
643*cdf0e10cSrcweir 				aMessage += ::rtl::OString(aDirect->second.getStr(), aDirect->second.getLength(), RTL_TEXTENCODING_ASCII_US);
644*cdf0e10cSrcweir 				aMessage += ::rtl::OString("!");
645*cdf0e10cSrcweir 				DBG_ERROR(aMessage.getStr());
646*cdf0e10cSrcweir #endif
647*cdf0e10cSrcweir 			}
648*cdf0e10cSrcweir 			// transfer it into an item
649*cdf0e10cSrcweir 			implTranslateProperty(_rDest, aDirect->first, aValue);
650*cdf0e10cSrcweir 		}
651*cdf0e10cSrcweir 
652*cdf0e10cSrcweir 		// get the additional informations
653*cdf0e10cSrcweir 		Sequence< PropertyValue > aAdditionalInfo;
654*cdf0e10cSrcweir 		try
655*cdf0e10cSrcweir 		{
656*cdf0e10cSrcweir 			_rxSource->getPropertyValue(PROPERTY_INFO) >>= aAdditionalInfo;
657*cdf0e10cSrcweir 		}
658*cdf0e10cSrcweir 		catch(Exception&) { }
659*cdf0e10cSrcweir 
660*cdf0e10cSrcweir 		// collect the names of the additional settings
661*cdf0e10cSrcweir 		const PropertyValue* pAdditionalInfo = aAdditionalInfo.getConstArray();
662*cdf0e10cSrcweir 		PropertyValueSet aInfos;
663*cdf0e10cSrcweir 		for (sal_Int32 i=0; i<aAdditionalInfo.getLength(); ++i, ++pAdditionalInfo)
664*cdf0e10cSrcweir 		{
665*cdf0e10cSrcweir 			if (0 == pAdditionalInfo->Name.compareToAscii("JDBCDRV"))
666*cdf0e10cSrcweir 			{	// compatibility
667*cdf0e10cSrcweir 				PropertyValue aCompatibility(*pAdditionalInfo);
668*cdf0e10cSrcweir 				aCompatibility.Name = ::rtl::OUString::createFromAscii("JavaDriverClass");
669*cdf0e10cSrcweir 				aInfos.insert(aCompatibility);
670*cdf0e10cSrcweir 			}
671*cdf0e10cSrcweir 			else
672*cdf0e10cSrcweir 				aInfos.insert(*pAdditionalInfo);
673*cdf0e10cSrcweir 		}
674*cdf0e10cSrcweir 
675*cdf0e10cSrcweir 		// go through all known translations and check if we have such a setting
676*cdf0e10cSrcweir         if ( !aInfos.empty() )
677*cdf0e10cSrcweir         {
678*cdf0e10cSrcweir 		    PropertyValue aSearchFor;
679*cdf0e10cSrcweir             ConstMapInt2StringIterator aEnd = m_aIndirectPropTranslator.end();
680*cdf0e10cSrcweir 		    for	(	ConstMapInt2StringIterator aIndirect = m_aIndirectPropTranslator.begin();
681*cdf0e10cSrcweir 				    aIndirect != aEnd;
682*cdf0e10cSrcweir 				    ++aIndirect)
683*cdf0e10cSrcweir 		    {
684*cdf0e10cSrcweir 			    aSearchFor.Name = aIndirect->second;
685*cdf0e10cSrcweir 			    ConstPropertyValueSetIterator aInfoPos = aInfos.find(aSearchFor);
686*cdf0e10cSrcweir 			    if (aInfos.end() != aInfoPos)
687*cdf0e10cSrcweir 				    // the property is contained in the info sequence
688*cdf0e10cSrcweir 				    // -> transfer it into an item
689*cdf0e10cSrcweir 				    implTranslateProperty(_rDest, aIndirect->first, aInfoPos->Value);
690*cdf0e10cSrcweir 		    }
691*cdf0e10cSrcweir         }
692*cdf0e10cSrcweir 
693*cdf0e10cSrcweir 		convertUrl(_rDest);
694*cdf0e10cSrcweir 	}
695*cdf0e10cSrcweir 
696*cdf0e10cSrcweir 	try
697*cdf0e10cSrcweir 	{
698*cdf0e10cSrcweir 		_rDest.Put(OPropertySetItem(DSID_DATASOURCE_UNO, _rxSource));
699*cdf0e10cSrcweir 		Reference<XStorable> xStore(getDataSourceOrModel(_rxSource),UNO_QUERY);
700*cdf0e10cSrcweir 		_rDest.Put(SfxBoolItem(DSID_READONLY, !xStore.is() || xStore->isReadonly() ));
701*cdf0e10cSrcweir 	}
702*cdf0e10cSrcweir 	catch(Exception&)
703*cdf0e10cSrcweir 	{
704*cdf0e10cSrcweir 		OSL_ENSURE(0,"IsReadOnly throws an exception!");
705*cdf0e10cSrcweir 	}
706*cdf0e10cSrcweir }
707*cdf0e10cSrcweir 
708*cdf0e10cSrcweir //-------------------------------------------------------------------------
709*cdf0e10cSrcweir void ODbDataSourceAdministrationHelper::translateProperties(const SfxItemSet& _rSource, const Reference< XPropertySet >& _rxDest)
710*cdf0e10cSrcweir {
711*cdf0e10cSrcweir 	DBG_ASSERT(_rxDest.is(), "ODbDataSourceAdministrationHelper::translateProperties: invalid property set!");
712*cdf0e10cSrcweir 	if (!_rxDest.is())
713*cdf0e10cSrcweir 		return;
714*cdf0e10cSrcweir 
715*cdf0e10cSrcweir 	// the property set info
716*cdf0e10cSrcweir 	Reference< XPropertySetInfo > xInfo;
717*cdf0e10cSrcweir 	try { xInfo = _rxDest->getPropertySetInfo(); }
718*cdf0e10cSrcweir 	catch(Exception&) { }
719*cdf0e10cSrcweir 
720*cdf0e10cSrcweir 	const ::rtl::OUString sUrlProp(RTL_CONSTASCII_USTRINGPARAM("URL"));
721*cdf0e10cSrcweir 	// -----------------------------
722*cdf0e10cSrcweir 	// transfer the direct properties
723*cdf0e10cSrcweir 	for	(	ConstMapInt2StringIterator aDirect = m_aDirectPropTranslator.begin();
724*cdf0e10cSrcweir 			aDirect != m_aDirectPropTranslator.end();
725*cdf0e10cSrcweir 			++aDirect
726*cdf0e10cSrcweir 		)
727*cdf0e10cSrcweir 	{
728*cdf0e10cSrcweir 		const SfxPoolItem* pCurrentItem = _rSource.GetItem((sal_uInt16)aDirect->first);
729*cdf0e10cSrcweir 		if (pCurrentItem)
730*cdf0e10cSrcweir 		{
731*cdf0e10cSrcweir 			sal_Int16 nAttributes = PropertyAttribute::READONLY;
732*cdf0e10cSrcweir 			if (xInfo.is())
733*cdf0e10cSrcweir 			{
734*cdf0e10cSrcweir 				try { nAttributes = xInfo->getPropertyByName(aDirect->second).Attributes; }
735*cdf0e10cSrcweir 				catch(Exception&) { }
736*cdf0e10cSrcweir 			}
737*cdf0e10cSrcweir 			if ((nAttributes & PropertyAttribute::READONLY) == 0)
738*cdf0e10cSrcweir 			{
739*cdf0e10cSrcweir 				if ( sUrlProp == aDirect->second )
740*cdf0e10cSrcweir 				{
741*cdf0e10cSrcweir 					Any aValue(makeAny(::rtl::OUString(getConnectionURL())));
742*cdf0e10cSrcweir 					//	aValue <<= ::rtl::OUString();
743*cdf0e10cSrcweir 					lcl_putProperty(_rxDest, aDirect->second,aValue);
744*cdf0e10cSrcweir 				}
745*cdf0e10cSrcweir 				else
746*cdf0e10cSrcweir 					implTranslateProperty(_rxDest, aDirect->second, pCurrentItem);
747*cdf0e10cSrcweir 			}
748*cdf0e10cSrcweir 		}
749*cdf0e10cSrcweir 	}
750*cdf0e10cSrcweir 
751*cdf0e10cSrcweir 	// -------------------------------
752*cdf0e10cSrcweir 	// now for the indirect properties
753*cdf0e10cSrcweir 
754*cdf0e10cSrcweir 	Sequence< PropertyValue > aInfo;
755*cdf0e10cSrcweir 	// the original properties
756*cdf0e10cSrcweir 	try
757*cdf0e10cSrcweir 	{
758*cdf0e10cSrcweir 		_rxDest->getPropertyValue(PROPERTY_INFO) >>= aInfo;
759*cdf0e10cSrcweir 	}
760*cdf0e10cSrcweir 	catch(Exception&) { }
761*cdf0e10cSrcweir 
762*cdf0e10cSrcweir 	// overwrite and extend them
763*cdf0e10cSrcweir 	fillDatasourceInfo(_rSource, aInfo);
764*cdf0e10cSrcweir 	// and propagate the (newly composed) sequence to the set
765*cdf0e10cSrcweir 	lcl_putProperty(_rxDest,PROPERTY_INFO, makeAny(aInfo));
766*cdf0e10cSrcweir }
767*cdf0e10cSrcweir 
768*cdf0e10cSrcweir 
769*cdf0e10cSrcweir //-------------------------------------------------------------------------
770*cdf0e10cSrcweir void ODbDataSourceAdministrationHelper::fillDatasourceInfo(const SfxItemSet& _rSource, Sequence< ::com::sun::star::beans::PropertyValue >& _rInfo)
771*cdf0e10cSrcweir {
772*cdf0e10cSrcweir 	// within the current "Info" sequence, replace the ones we can examine from the item set
773*cdf0e10cSrcweir 	// (we don't just fill a completely new sequence with our own items, but we preserve any properties unknown to
774*cdf0e10cSrcweir 	// us)
775*cdf0e10cSrcweir 
776*cdf0e10cSrcweir 	// first determine which of all the items are relevant for the data source (depends on the connection url)
777*cdf0e10cSrcweir 	::rtl::OUString eType = getDatasourceType(_rSource);
778*cdf0e10cSrcweir 	::std::vector< sal_Int32> aDetailIds;
779*cdf0e10cSrcweir 	ODriversSettings::getSupportedIndirectSettings(eType,getORB(),aDetailIds);
780*cdf0e10cSrcweir 
781*cdf0e10cSrcweir     // collect the translated property values for the relevant items
782*cdf0e10cSrcweir 	PropertyValueSet aRelevantSettings;
783*cdf0e10cSrcweir 	ConstMapInt2StringIterator aTranslation;
784*cdf0e10cSrcweir 	::std::vector< sal_Int32>::iterator aDetailsEnd = aDetailIds.end();
785*cdf0e10cSrcweir 	for (::std::vector< sal_Int32>::iterator aIter = aDetailIds.begin();aIter != aDetailsEnd ; ++aIter)
786*cdf0e10cSrcweir 	{
787*cdf0e10cSrcweir 		const SfxPoolItem* pCurrent = _rSource.GetItem((sal_uInt16)*aIter);
788*cdf0e10cSrcweir 		aTranslation = m_aIndirectPropTranslator.find(*aIter);
789*cdf0e10cSrcweir 		if ( pCurrent && (m_aIndirectPropTranslator.end() != aTranslation) )
790*cdf0e10cSrcweir 		{
791*cdf0e10cSrcweir 			if ( aTranslation->second == INFO_CHARSET )
792*cdf0e10cSrcweir 			{
793*cdf0e10cSrcweir 				::rtl::OUString sCharSet;
794*cdf0e10cSrcweir 				implTranslateProperty(pCurrent) >>= sCharSet;
795*cdf0e10cSrcweir 				if ( sCharSet.getLength() )
796*cdf0e10cSrcweir 					aRelevantSettings.insert(PropertyValue(aTranslation->second, 0, makeAny(sCharSet), PropertyState_DIRECT_VALUE));
797*cdf0e10cSrcweir 			}
798*cdf0e10cSrcweir 			else
799*cdf0e10cSrcweir 				aRelevantSettings.insert(PropertyValue(aTranslation->second, 0, implTranslateProperty(pCurrent), PropertyState_DIRECT_VALUE));
800*cdf0e10cSrcweir 		}
801*cdf0e10cSrcweir 	}
802*cdf0e10cSrcweir 
803*cdf0e10cSrcweir 	// settings to preserve
804*cdf0e10cSrcweir 	MapInt2String	aPreservedSettings;
805*cdf0e10cSrcweir 
806*cdf0e10cSrcweir 	// now aRelevantSettings contains all the property values relevant for the current data source type,
807*cdf0e10cSrcweir 	// check the original sequence if it already contains any of these values (which have to be overwritten, then)
808*cdf0e10cSrcweir 	PropertyValue* pInfo = _rInfo.getArray();
809*cdf0e10cSrcweir 	PropertyValue aSearchFor;
810*cdf0e10cSrcweir 	sal_Int32 nObsoleteSetting = -1;
811*cdf0e10cSrcweir 	sal_Int32 nCount = _rInfo.getLength();
812*cdf0e10cSrcweir 	for (sal_Int32 i = 0; i < nCount; ++i, ++pInfo)
813*cdf0e10cSrcweir 	{
814*cdf0e10cSrcweir 		aSearchFor.Name = pInfo->Name;
815*cdf0e10cSrcweir 		PropertyValueSetIterator aOverwrittenSetting = aRelevantSettings.find(aSearchFor);
816*cdf0e10cSrcweir 		if (aRelevantSettings.end() != aOverwrittenSetting)
817*cdf0e10cSrcweir 		{	// the setting was present in the original sequence, and it is to be overwritten -> replace it
818*cdf0e10cSrcweir 			if ( !::comphelper::compare(pInfo->Value,aOverwrittenSetting->Value) )
819*cdf0e10cSrcweir 				*pInfo = *aOverwrittenSetting;
820*cdf0e10cSrcweir 			aRelevantSettings.erase(aOverwrittenSetting);
821*cdf0e10cSrcweir 		}
822*cdf0e10cSrcweir 		else if (0 == pInfo->Name.compareToAscii("JDBCDRV"))
823*cdf0e10cSrcweir 		{	// this is a compatibility setting, remove it from the sequence (it's replaced by JavaDriverClass)
824*cdf0e10cSrcweir 			nObsoleteSetting = i;
825*cdf0e10cSrcweir 		}
826*cdf0e10cSrcweir 		else
827*cdf0e10cSrcweir 			aPreservedSettings[i] = pInfo->Name;
828*cdf0e10cSrcweir 	}
829*cdf0e10cSrcweir 	if (-1 != nObsoleteSetting)
830*cdf0e10cSrcweir 		::comphelper::removeElementAt(_rInfo, nObsoleteSetting);
831*cdf0e10cSrcweir 
832*cdf0e10cSrcweir 	if ( !aPreservedSettings.empty() )
833*cdf0e10cSrcweir 	{	// check if there are settings which
834*cdf0e10cSrcweir 		// * are known as indirect properties
835*cdf0e10cSrcweir 		// * but not relevant for the current data source type
836*cdf0e10cSrcweir 		// These settings have to be removed: If they're not relevant, we have no UI for changing them.
837*cdf0e10cSrcweir 		// 25.06.2001 - 88004/87182 - frank.schoenheit@sun.com
838*cdf0e10cSrcweir 
839*cdf0e10cSrcweir 		// for this, we need a string-controlled quick access to m_aIndirectPropTranslator
840*cdf0e10cSrcweir 		StringSet aIndirectProps;
841*cdf0e10cSrcweir 		::std::transform(m_aIndirectPropTranslator.begin(),
842*cdf0e10cSrcweir 						 m_aIndirectPropTranslator.end(),
843*cdf0e10cSrcweir 						 ::std::insert_iterator<StringSet>(aIndirectProps,aIndirectProps.begin()),
844*cdf0e10cSrcweir 						 ::std::select2nd<MapInt2String::value_type>());
845*cdf0e10cSrcweir 
846*cdf0e10cSrcweir 		// now check the to-be-preserved props
847*cdf0e10cSrcweir 		::std::vector< sal_Int32 > aRemoveIndexes;
848*cdf0e10cSrcweir 		sal_Int32 nPositionCorrector = 0;
849*cdf0e10cSrcweir 		ConstMapInt2StringIterator aPreservedEnd = aPreservedSettings.end();
850*cdf0e10cSrcweir 		for	(	ConstMapInt2StringIterator aPreserved = aPreservedSettings.begin();
851*cdf0e10cSrcweir 				aPreserved != aPreservedEnd;
852*cdf0e10cSrcweir 				++aPreserved
853*cdf0e10cSrcweir 			)
854*cdf0e10cSrcweir 		{
855*cdf0e10cSrcweir 			if (aIndirectProps.end() != aIndirectProps.find(aPreserved->second))
856*cdf0e10cSrcweir 			{
857*cdf0e10cSrcweir #ifdef DBG_UTIL
858*cdf0e10cSrcweir 				const ::rtl::OUString sName = aPreserved->second;
859*cdf0e10cSrcweir #endif
860*cdf0e10cSrcweir 				aRemoveIndexes.push_back(aPreserved->first - nPositionCorrector);
861*cdf0e10cSrcweir 				++nPositionCorrector;
862*cdf0e10cSrcweir 			}
863*cdf0e10cSrcweir 		}
864*cdf0e10cSrcweir 		// now finally remove all such props
865*cdf0e10cSrcweir 		::std::vector< sal_Int32 >::const_iterator aRemoveEnd = aRemoveIndexes.end();
866*cdf0e10cSrcweir 		for (	::std::vector< sal_Int32 >::const_iterator aRemoveIndex = aRemoveIndexes.begin();
867*cdf0e10cSrcweir 				aRemoveIndex != aRemoveEnd;
868*cdf0e10cSrcweir 				++aRemoveIndex
869*cdf0e10cSrcweir 			)
870*cdf0e10cSrcweir 			::comphelper::removeElementAt(_rInfo, *aRemoveIndex);
871*cdf0e10cSrcweir #ifdef DBG_UTIL
872*cdf0e10cSrcweir 		const PropertyValue* pWhatsLeft = _rInfo.getConstArray();
873*cdf0e10cSrcweir 		const PropertyValue* pWhatsLeftEnd = pWhatsLeft + _rInfo.getLength();
874*cdf0e10cSrcweir 		for (; pWhatsLeft != pWhatsLeftEnd; ++pWhatsLeft)
875*cdf0e10cSrcweir 		{
876*cdf0e10cSrcweir 			::rtl::OUString sLookAtIt = pWhatsLeft->Name;
877*cdf0e10cSrcweir 		}
878*cdf0e10cSrcweir #endif
879*cdf0e10cSrcweir 	}
880*cdf0e10cSrcweir 
881*cdf0e10cSrcweir     ::connectivity::DriversConfig aDriverConfig(getORB());
882*cdf0e10cSrcweir     const ::comphelper::NamedValueCollection& aProperties = aDriverConfig.getProperties(eType);
883*cdf0e10cSrcweir     Sequence< Any> aTypeSettings;
884*cdf0e10cSrcweir     aTypeSettings = aProperties.getOrDefault("TypeInfoSettings",aTypeSettings);
885*cdf0e10cSrcweir     // here we have a special entry for types from oracle
886*cdf0e10cSrcweir     if ( aTypeSettings.getLength() )
887*cdf0e10cSrcweir     {
888*cdf0e10cSrcweir         aRelevantSettings.insert(PropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TypeInfoSettings")), 0, makeAny(aTypeSettings), PropertyState_DIRECT_VALUE));
889*cdf0e10cSrcweir     }
890*cdf0e10cSrcweir 
891*cdf0e10cSrcweir 	// check which values are still left ('cause they were not present in the original sequence, but are to be set)
892*cdf0e10cSrcweir 	if ( !aRelevantSettings.empty() )
893*cdf0e10cSrcweir 	{
894*cdf0e10cSrcweir 		sal_Int32 nOldLength = _rInfo.getLength();
895*cdf0e10cSrcweir 		_rInfo.realloc(nOldLength + aRelevantSettings.size());
896*cdf0e10cSrcweir 		PropertyValue* pAppendValues = _rInfo.getArray() + nOldLength;
897*cdf0e10cSrcweir 		ConstPropertyValueSetIterator aRelevantEnd = aRelevantSettings.end();
898*cdf0e10cSrcweir 		for	(	ConstPropertyValueSetIterator aLoop = aRelevantSettings.begin();
899*cdf0e10cSrcweir 				aLoop != aRelevantEnd;
900*cdf0e10cSrcweir 				++aLoop, ++pAppendValues
901*cdf0e10cSrcweir 			)
902*cdf0e10cSrcweir 		{
903*cdf0e10cSrcweir 			if ( aLoop->Name == INFO_CHARSET )
904*cdf0e10cSrcweir 			{
905*cdf0e10cSrcweir 				::rtl::OUString sCharSet;
906*cdf0e10cSrcweir 				aLoop->Value >>= sCharSet;
907*cdf0e10cSrcweir 				if ( sCharSet.getLength() )
908*cdf0e10cSrcweir 					*pAppendValues = *aLoop;
909*cdf0e10cSrcweir 			}
910*cdf0e10cSrcweir 			else
911*cdf0e10cSrcweir 				*pAppendValues = *aLoop;
912*cdf0e10cSrcweir 		}
913*cdf0e10cSrcweir 	}
914*cdf0e10cSrcweir }
915*cdf0e10cSrcweir //-------------------------------------------------------------------------
916*cdf0e10cSrcweir Any ODbDataSourceAdministrationHelper::implTranslateProperty(const SfxPoolItem* _pItem)
917*cdf0e10cSrcweir {
918*cdf0e10cSrcweir 	// translate the SfxPoolItem
919*cdf0e10cSrcweir 	Any aValue;
920*cdf0e10cSrcweir 
921*cdf0e10cSrcweir     const SfxStringItem* pStringItem = PTR_CAST( SfxStringItem, _pItem );
922*cdf0e10cSrcweir     const SfxBoolItem* pBoolItem = PTR_CAST( SfxBoolItem, _pItem );
923*cdf0e10cSrcweir     const OptionalBoolItem* pOptBoolItem = PTR_CAST( OptionalBoolItem, _pItem );
924*cdf0e10cSrcweir     const SfxInt32Item* pInt32Item = PTR_CAST( SfxInt32Item, _pItem );
925*cdf0e10cSrcweir     const OStringListItem* pStringListItem = PTR_CAST( OStringListItem, _pItem );
926*cdf0e10cSrcweir 
927*cdf0e10cSrcweir 	if ( pStringItem )
928*cdf0e10cSrcweir     {
929*cdf0e10cSrcweir 		aValue <<= ::rtl::OUString( pStringItem->GetValue().GetBuffer() );
930*cdf0e10cSrcweir     }
931*cdf0e10cSrcweir 	else if ( pBoolItem )
932*cdf0e10cSrcweir     {
933*cdf0e10cSrcweir 		aValue <<= pBoolItem->GetValue();
934*cdf0e10cSrcweir     }
935*cdf0e10cSrcweir     else if ( pOptBoolItem )
936*cdf0e10cSrcweir     {
937*cdf0e10cSrcweir         if ( !pOptBoolItem->HasValue() )
938*cdf0e10cSrcweir             aValue.clear();
939*cdf0e10cSrcweir         else
940*cdf0e10cSrcweir             aValue <<= (sal_Bool)pOptBoolItem->GetValue();
941*cdf0e10cSrcweir     }
942*cdf0e10cSrcweir 	else if ( pInt32Item )
943*cdf0e10cSrcweir     {
944*cdf0e10cSrcweir 		aValue <<= pInt32Item->GetValue();
945*cdf0e10cSrcweir     }
946*cdf0e10cSrcweir 	else if ( pStringListItem )
947*cdf0e10cSrcweir     {
948*cdf0e10cSrcweir 		aValue <<= pStringListItem->getList();
949*cdf0e10cSrcweir     }
950*cdf0e10cSrcweir 	else
951*cdf0e10cSrcweir 	{
952*cdf0e10cSrcweir 		DBG_ERROR("ODbDataSourceAdministrationHelper::implTranslateProperty: unsupported item type!");
953*cdf0e10cSrcweir 		return aValue;
954*cdf0e10cSrcweir 	}
955*cdf0e10cSrcweir 
956*cdf0e10cSrcweir 	return aValue;
957*cdf0e10cSrcweir }
958*cdf0e10cSrcweir //-------------------------------------------------------------------------
959*cdf0e10cSrcweir void ODbDataSourceAdministrationHelper::implTranslateProperty(const Reference< XPropertySet >& _rxSet, const ::rtl::OUString& _rName, const SfxPoolItem* _pItem)
960*cdf0e10cSrcweir {
961*cdf0e10cSrcweir 	Any aValue = implTranslateProperty(_pItem);
962*cdf0e10cSrcweir 	lcl_putProperty(_rxSet, _rName,aValue);
963*cdf0e10cSrcweir }
964*cdf0e10cSrcweir #ifdef DBG_UTIL
965*cdf0e10cSrcweir //-------------------------------------------------------------------------
966*cdf0e10cSrcweir ::rtl::OString ODbDataSourceAdministrationHelper::translatePropertyId( sal_Int32 _nId )
967*cdf0e10cSrcweir {
968*cdf0e10cSrcweir 	::rtl::OUString aString;
969*cdf0e10cSrcweir 
970*cdf0e10cSrcweir 	MapInt2String::const_iterator aPos = m_aDirectPropTranslator.find( _nId );
971*cdf0e10cSrcweir 	if ( m_aDirectPropTranslator.end() != aPos )
972*cdf0e10cSrcweir 	{
973*cdf0e10cSrcweir 		aString = aPos->second;
974*cdf0e10cSrcweir 	}
975*cdf0e10cSrcweir 	else
976*cdf0e10cSrcweir 	{
977*cdf0e10cSrcweir 		MapInt2String::const_iterator indirectPos = m_aIndirectPropTranslator.find( _nId );
978*cdf0e10cSrcweir 		if ( m_aIndirectPropTranslator.end() != indirectPos )
979*cdf0e10cSrcweir 			aString = indirectPos->second;
980*cdf0e10cSrcweir 	}
981*cdf0e10cSrcweir 
982*cdf0e10cSrcweir 	::rtl::OString aReturn( aString.getStr(), aString.getLength(), RTL_TEXTENCODING_ASCII_US );
983*cdf0e10cSrcweir 	return aReturn;
984*cdf0e10cSrcweir }
985*cdf0e10cSrcweir #endif
986*cdf0e10cSrcweir 
987*cdf0e10cSrcweir //-------------------------------------------------------------------------
988*cdf0e10cSrcweir void ODbDataSourceAdministrationHelper::implTranslateProperty( SfxItemSet& _rSet, sal_Int32  _nId, const Any& _rValue )
989*cdf0e10cSrcweir {
990*cdf0e10cSrcweir 	switch ( _rValue.getValueType().getTypeClass() )
991*cdf0e10cSrcweir 	{
992*cdf0e10cSrcweir 		case TypeClass_STRING:
993*cdf0e10cSrcweir 			if ( implCheckItemType( _rSet, _nId, SfxStringItem::StaticType() ) )
994*cdf0e10cSrcweir 			{
995*cdf0e10cSrcweir 				::rtl::OUString sValue;
996*cdf0e10cSrcweir 				_rValue >>= sValue;
997*cdf0e10cSrcweir 				_rSet.Put(SfxStringItem(_nId, sValue.getStr()));
998*cdf0e10cSrcweir 			}
999*cdf0e10cSrcweir 			else {
1000*cdf0e10cSrcweir 				DBG_ERROR(
1001*cdf0e10cSrcweir 					(	::rtl::OString( "ODbDataSourceAdministrationHelper::implTranslateProperty: invalid property value (" )
1002*cdf0e10cSrcweir 					+=	::rtl::OString( translatePropertyId( _nId ) )
1003*cdf0e10cSrcweir 					+=	::rtl::OString( " should be no string)!" )
1004*cdf0e10cSrcweir 					).getStr()
1005*cdf0e10cSrcweir 				);
1006*cdf0e10cSrcweir             }
1007*cdf0e10cSrcweir 			break;
1008*cdf0e10cSrcweir 
1009*cdf0e10cSrcweir 		case TypeClass_BOOLEAN:
1010*cdf0e10cSrcweir 			if ( implCheckItemType( _rSet, _nId, SfxBoolItem::StaticType() ) )
1011*cdf0e10cSrcweir 			{
1012*cdf0e10cSrcweir 				sal_Bool bVal = sal_False;
1013*cdf0e10cSrcweir 				_rValue >>= bVal;
1014*cdf0e10cSrcweir 				_rSet.Put(SfxBoolItem(_nId, bVal));
1015*cdf0e10cSrcweir 			}
1016*cdf0e10cSrcweir             else if ( implCheckItemType( _rSet, _nId, OptionalBoolItem::StaticType() ) )
1017*cdf0e10cSrcweir             {
1018*cdf0e10cSrcweir                 OptionalBoolItem aItem( _nId );
1019*cdf0e10cSrcweir                 if ( _rValue.hasValue() )
1020*cdf0e10cSrcweir                 {
1021*cdf0e10cSrcweir 				    sal_Bool bValue = sal_False;
1022*cdf0e10cSrcweir 				    _rValue >>= bValue;
1023*cdf0e10cSrcweir                     aItem.SetValue( bValue );
1024*cdf0e10cSrcweir                 }
1025*cdf0e10cSrcweir                 else
1026*cdf0e10cSrcweir                     aItem.ClearValue();
1027*cdf0e10cSrcweir 				_rSet.Put( aItem );
1028*cdf0e10cSrcweir             }
1029*cdf0e10cSrcweir 			else {
1030*cdf0e10cSrcweir 				DBG_ERROR(
1031*cdf0e10cSrcweir 					(	::rtl::OString( "ODbDataSourceAdministrationHelper::implTranslateProperty: invalid property value (" )
1032*cdf0e10cSrcweir 					+=	::rtl::OString( translatePropertyId( _nId ) )
1033*cdf0e10cSrcweir 					+=	::rtl::OString( " should be no boolean)!" )
1034*cdf0e10cSrcweir 					).getStr()
1035*cdf0e10cSrcweir 				);
1036*cdf0e10cSrcweir             }
1037*cdf0e10cSrcweir 			break;
1038*cdf0e10cSrcweir 
1039*cdf0e10cSrcweir 		case TypeClass_LONG:
1040*cdf0e10cSrcweir 			if ( implCheckItemType( _rSet, _nId, SfxInt32Item::StaticType() ) )
1041*cdf0e10cSrcweir 			{
1042*cdf0e10cSrcweir 				sal_Int32 nValue = 0;
1043*cdf0e10cSrcweir 				_rValue >>= nValue;
1044*cdf0e10cSrcweir 				_rSet.Put( SfxInt32Item( _nId, nValue ) );
1045*cdf0e10cSrcweir 			}
1046*cdf0e10cSrcweir 			else {
1047*cdf0e10cSrcweir 				DBG_ERROR(
1048*cdf0e10cSrcweir 					(	::rtl::OString( "ODbDataSourceAdministrationHelper::implTranslateProperty: invalid property value (" )
1049*cdf0e10cSrcweir 					+=	::rtl::OString( translatePropertyId( _nId ) )
1050*cdf0e10cSrcweir 					+=	::rtl::OString( " should be no int)!" )
1051*cdf0e10cSrcweir 					).getStr()
1052*cdf0e10cSrcweir 				);
1053*cdf0e10cSrcweir             }
1054*cdf0e10cSrcweir 			break;
1055*cdf0e10cSrcweir 
1056*cdf0e10cSrcweir 		case TypeClass_SEQUENCE:
1057*cdf0e10cSrcweir 			if ( implCheckItemType( _rSet, _nId, OStringListItem::StaticType() ) )
1058*cdf0e10cSrcweir 			{
1059*cdf0e10cSrcweir 				// determine the element type
1060*cdf0e10cSrcweir 				TypeDescription aTD(_rValue.getValueType());
1061*cdf0e10cSrcweir 				typelib_IndirectTypeDescription* pSequenceTD =
1062*cdf0e10cSrcweir 					reinterpret_cast< typelib_IndirectTypeDescription* >(aTD.get());
1063*cdf0e10cSrcweir 				DBG_ASSERT(pSequenceTD && pSequenceTD->pType, "ODbDataSourceAdministrationHelper::implTranslateProperty: invalid sequence type!");
1064*cdf0e10cSrcweir 
1065*cdf0e10cSrcweir 				Type aElementType(pSequenceTD->pType);
1066*cdf0e10cSrcweir 				switch (aElementType.getTypeClass())
1067*cdf0e10cSrcweir 				{
1068*cdf0e10cSrcweir 					case TypeClass_STRING:
1069*cdf0e10cSrcweir 					{
1070*cdf0e10cSrcweir 						Sequence< ::rtl::OUString > aStringList;
1071*cdf0e10cSrcweir 						_rValue >>= aStringList;
1072*cdf0e10cSrcweir 						_rSet.Put(OStringListItem(_nId, aStringList));
1073*cdf0e10cSrcweir 					}
1074*cdf0e10cSrcweir 					break;
1075*cdf0e10cSrcweir 					default:
1076*cdf0e10cSrcweir 						DBG_ERROR("ODbDataSourceAdministrationHelper::implTranslateProperty: unsupported property value type!");
1077*cdf0e10cSrcweir 				}
1078*cdf0e10cSrcweir 			}
1079*cdf0e10cSrcweir 			else {
1080*cdf0e10cSrcweir 				DBG_ERROR(
1081*cdf0e10cSrcweir 					(	::rtl::OString( "ODbDataSourceAdministrationHelper::implTranslateProperty: invalid property value (" )
1082*cdf0e10cSrcweir 					+=	::rtl::OString( translatePropertyId( _nId ) )
1083*cdf0e10cSrcweir 					+=	::rtl::OString( " should be no string sequence)!" )
1084*cdf0e10cSrcweir 					).getStr()
1085*cdf0e10cSrcweir 				);
1086*cdf0e10cSrcweir             }
1087*cdf0e10cSrcweir 			break;
1088*cdf0e10cSrcweir 
1089*cdf0e10cSrcweir 		case TypeClass_VOID:
1090*cdf0e10cSrcweir 			_rSet.ClearItem(_nId);
1091*cdf0e10cSrcweir 			break;
1092*cdf0e10cSrcweir 
1093*cdf0e10cSrcweir 		default:
1094*cdf0e10cSrcweir 			DBG_ERROR("ODbDataSourceAdministrationHelper::implTranslateProperty: unsupported property value type!");
1095*cdf0e10cSrcweir 	}
1096*cdf0e10cSrcweir }
1097*cdf0e10cSrcweir 
1098*cdf0e10cSrcweir 
1099*cdf0e10cSrcweir String ODbDataSourceAdministrationHelper::getDocumentUrl(SfxItemSet& _rDest)
1100*cdf0e10cSrcweir {
1101*cdf0e10cSrcweir     SFX_ITEMSET_GET(_rDest, pUrlItem, SfxStringItem, DSID_DOCUMENT_URL, sal_True);
1102*cdf0e10cSrcweir 	OSL_ENSURE(pUrlItem,"Document URL is NULL. -> GPF!");
1103*cdf0e10cSrcweir     return pUrlItem->GetValue();
1104*cdf0e10cSrcweir }
1105*cdf0e10cSrcweir 
1106*cdf0e10cSrcweir 
1107*cdf0e10cSrcweir // -----------------------------------------------------------------------------
1108*cdf0e10cSrcweir void ODbDataSourceAdministrationHelper::convertUrl(SfxItemSet& _rDest)
1109*cdf0e10cSrcweir {
1110*cdf0e10cSrcweir 	::rtl::OUString eType = getDatasourceType(_rDest);
1111*cdf0e10cSrcweir 
1112*cdf0e10cSrcweir 	SFX_ITEMSET_GET(_rDest, pUrlItem, SfxStringItem, DSID_CONNECTURL, sal_True);
1113*cdf0e10cSrcweir 	SFX_ITEMSET_GET(_rDest, pTypeCollection, DbuTypeCollectionItem, DSID_TYPECOLLECTION, sal_True);
1114*cdf0e10cSrcweir 
1115*cdf0e10cSrcweir 	OSL_ENSURE(pUrlItem,"Connection URL is NULL. -> GPF!");
1116*cdf0e10cSrcweir 	DBG_ASSERT(pTypeCollection, "ODbAdminDialog::getDatasourceType: invalid items in the source set!");
1117*cdf0e10cSrcweir 	::dbaccess::ODsnTypeCollection* pCollection = pTypeCollection->getCollection();
1118*cdf0e10cSrcweir 	DBG_ASSERT(pCollection, "ODbAdminDialog::getDatasourceType: invalid type collection!");
1119*cdf0e10cSrcweir 
1120*cdf0e10cSrcweir 	sal_uInt16 nPortNumberId	= 0;
1121*cdf0e10cSrcweir 	sal_Int32 nPortNumber	= -1;
1122*cdf0e10cSrcweir 	String sNewHostName;
1123*cdf0e10cSrcweir 	//String sUrl = pCollection->cutPrefix(pUrlItem->GetValue());
1124*cdf0e10cSrcweir 	String sUrlPart;
1125*cdf0e10cSrcweir 
1126*cdf0e10cSrcweir 	pCollection->extractHostNamePort(pUrlItem->GetValue(),sUrlPart,sNewHostName,nPortNumber);
1127*cdf0e10cSrcweir     const ::dbaccess::DATASOURCE_TYPE eTy = pCollection->determineType(eType);
1128*cdf0e10cSrcweir 
1129*cdf0e10cSrcweir 	switch( eTy )
1130*cdf0e10cSrcweir 	{
1131*cdf0e10cSrcweir         case  ::dbaccess::DST_MYSQL_NATIVE:
1132*cdf0e10cSrcweir 		case  ::dbaccess::DST_MYSQL_JDBC:
1133*cdf0e10cSrcweir 			nPortNumberId = DSID_MYSQL_PORTNUMBER;
1134*cdf0e10cSrcweir 			break;
1135*cdf0e10cSrcweir 		case  ::dbaccess::DST_ORACLE_JDBC:
1136*cdf0e10cSrcweir 			nPortNumberId = DSID_ORACLE_PORTNUMBER;
1137*cdf0e10cSrcweir 			break;
1138*cdf0e10cSrcweir 		case  ::dbaccess::DST_LDAP:
1139*cdf0e10cSrcweir 			nPortNumberId = DSID_CONN_LDAP_PORTNUMBER;
1140*cdf0e10cSrcweir 			break;
1141*cdf0e10cSrcweir         default:
1142*cdf0e10cSrcweir             break;
1143*cdf0e10cSrcweir 	}
1144*cdf0e10cSrcweir 
1145*cdf0e10cSrcweir 	if ( sUrlPart.Len() )
1146*cdf0e10cSrcweir 	{
1147*cdf0e10cSrcweir         if ( eTy == ::dbaccess::DST_MYSQL_NATIVE )
1148*cdf0e10cSrcweir         {
1149*cdf0e10cSrcweir 		    _rDest.Put( SfxStringItem( DSID_DATABASENAME, sUrlPart ) );
1150*cdf0e10cSrcweir         }
1151*cdf0e10cSrcweir         else
1152*cdf0e10cSrcweir         {
1153*cdf0e10cSrcweir 		    String sNewUrl = pCollection->getPrefix(eType);
1154*cdf0e10cSrcweir 		    sNewUrl += sUrlPart;
1155*cdf0e10cSrcweir 		    _rDest.Put( SfxStringItem( DSID_CONNECTURL, sNewUrl ) );
1156*cdf0e10cSrcweir         }
1157*cdf0e10cSrcweir 	}
1158*cdf0e10cSrcweir 
1159*cdf0e10cSrcweir 	if ( sNewHostName.Len() )
1160*cdf0e10cSrcweir 		_rDest.Put(SfxStringItem(DSID_CONN_HOSTNAME, sNewHostName));
1161*cdf0e10cSrcweir 
1162*cdf0e10cSrcweir 	if ( nPortNumber != -1 && nPortNumberId != 0 )
1163*cdf0e10cSrcweir 		_rDest.Put(SfxInt32Item(nPortNumberId, nPortNumber));
1164*cdf0e10cSrcweir 
1165*cdf0e10cSrcweir }
1166*cdf0e10cSrcweir // -----------------------------------------------------------------------------
1167*cdf0e10cSrcweir sal_Bool ODbDataSourceAdministrationHelper::saveChanges(const SfxItemSet& _rSource)
1168*cdf0e10cSrcweir {
1169*cdf0e10cSrcweir 	// put the remembered settings into the property set
1170*cdf0e10cSrcweir 	Reference<XPropertySet> xDatasource = getCurrentDataSource();
1171*cdf0e10cSrcweir 	if ( !xDatasource.is() )
1172*cdf0e10cSrcweir 		return sal_False;
1173*cdf0e10cSrcweir 
1174*cdf0e10cSrcweir 	translateProperties(_rSource,xDatasource );
1175*cdf0e10cSrcweir 
1176*cdf0e10cSrcweir 	return sal_True;
1177*cdf0e10cSrcweir }
1178*cdf0e10cSrcweir // -----------------------------------------------------------------------------
1179*cdf0e10cSrcweir void ODbDataSourceAdministrationHelper::setDataSourceOrName( const Any& _rDataSourceOrName )
1180*cdf0e10cSrcweir {
1181*cdf0e10cSrcweir     DBG_ASSERT( !m_aDataSourceOrName.hasValue(), "ODbDataSourceAdministrationHelper::setDataSourceOrName: already have one!" );
1182*cdf0e10cSrcweir         // hmm. We could reset m_xDatasource/m_xModel, probably, and continue working
1183*cdf0e10cSrcweir 	m_aDataSourceOrName = _rDataSourceOrName;
1184*cdf0e10cSrcweir }
1185*cdf0e10cSrcweir //=========================================================================
1186*cdf0e10cSrcweir //= DbuTypeCollectionItem
1187*cdf0e10cSrcweir //=========================================================================
1188*cdf0e10cSrcweir TYPEINIT1(DbuTypeCollectionItem, SfxPoolItem);
1189*cdf0e10cSrcweir //-------------------------------------------------------------------------
1190*cdf0e10cSrcweir DbuTypeCollectionItem::DbuTypeCollectionItem(sal_Int16 _nWhich, ::dbaccess::ODsnTypeCollection* _pCollection)
1191*cdf0e10cSrcweir 	:SfxPoolItem(_nWhich)
1192*cdf0e10cSrcweir 	,m_pCollection(_pCollection)
1193*cdf0e10cSrcweir {
1194*cdf0e10cSrcweir }
1195*cdf0e10cSrcweir 
1196*cdf0e10cSrcweir //-------------------------------------------------------------------------
1197*cdf0e10cSrcweir DbuTypeCollectionItem::DbuTypeCollectionItem(const DbuTypeCollectionItem& _rSource)
1198*cdf0e10cSrcweir 	:SfxPoolItem(_rSource)
1199*cdf0e10cSrcweir 	,m_pCollection(_rSource.getCollection())
1200*cdf0e10cSrcweir {
1201*cdf0e10cSrcweir }
1202*cdf0e10cSrcweir 
1203*cdf0e10cSrcweir //-------------------------------------------------------------------------
1204*cdf0e10cSrcweir int DbuTypeCollectionItem::operator==(const SfxPoolItem& _rItem) const
1205*cdf0e10cSrcweir {
1206*cdf0e10cSrcweir 	DbuTypeCollectionItem* pCompare = PTR_CAST(DbuTypeCollectionItem, &_rItem);
1207*cdf0e10cSrcweir 	return pCompare && (pCompare->getCollection() == getCollection());
1208*cdf0e10cSrcweir }
1209*cdf0e10cSrcweir 
1210*cdf0e10cSrcweir //-------------------------------------------------------------------------
1211*cdf0e10cSrcweir SfxPoolItem* DbuTypeCollectionItem::Clone(SfxItemPool* /*_pPool*/) const
1212*cdf0e10cSrcweir {
1213*cdf0e10cSrcweir 	return new DbuTypeCollectionItem(*this);
1214*cdf0e10cSrcweir }
1215*cdf0e10cSrcweir 
1216*cdf0e10cSrcweir //.........................................................................
1217*cdf0e10cSrcweir }	// namespace dbaui
1218*cdf0e10cSrcweir //.........................................................................
1219*cdf0e10cSrcweir 
1220*cdf0e10cSrcweir 
1221*cdf0e10cSrcweir 
1222