| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_dbaccess.hxx" |
| |
| #include "dsntypes.hxx" |
| #include "dbamiscres.hrc" |
| #include <unotools/confignode.hxx> |
| #include <tools/debug.hxx> |
| #include <tools/wldcrd.hxx> |
| #include <osl/file.hxx> |
| #include "dbastrings.hrc" |
| #include "core_resource.hxx" |
| #include "core_resource.hrc" |
| #include <comphelper/documentconstants.hxx> |
| |
| //......................................................................... |
| namespace dbaccess |
| { |
| //......................................................................... |
| |
| using namespace ::com::sun::star; |
| using namespace ::com::sun::star::uno; |
| using namespace ::com::sun::star::beans; |
| using namespace ::com::sun::star::lang; |
| //using namespace ::com::sun::star::sdbc; |
| |
| namespace |
| { |
| void lcl_extractHostAndPort(const String& _sUrl,String& _sHostname,sal_Int32& _nPortNumber) |
| { |
| if ( _sUrl.GetTokenCount(':') >= 2 ) |
| { |
| _sHostname = _sUrl.GetToken(0,':'); |
| _nPortNumber = _sUrl.GetToken(1,':').ToInt32(); |
| } |
| } |
| } |
| //========================================================================= |
| //= ODsnTypeCollection |
| //========================================================================= |
| DBG_NAME(ODsnTypeCollection) |
| //------------------------------------------------------------------------- |
| ODsnTypeCollection::ODsnTypeCollection(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _xFactory) |
| :m_aDriverConfig(_xFactory) |
| ,m_xFactory(_xFactory) |
| #ifdef DBG_UTIL |
| ,m_nLivingIterators(0) |
| #endif |
| { |
| DBG_CTOR(ODsnTypeCollection,NULL); |
| const uno::Sequence< ::rtl::OUString > aURLs = m_aDriverConfig.getURLs(); |
| const ::rtl::OUString* pIter = aURLs.getConstArray(); |
| const ::rtl::OUString* pEnd = pIter + aURLs.getLength(); |
| for(;pIter != pEnd;++pIter ) |
| { |
| m_aDsnPrefixes.push_back(*pIter); |
| m_aDsnTypesDisplayNames.push_back(m_aDriverConfig.getDriverTypeDisplayName(*pIter)); |
| } |
| |
| DBG_ASSERT(m_aDsnTypesDisplayNames.size() == m_aDsnPrefixes.size(), |
| "ODsnTypeCollection::ODsnTypeCollection : invalid resources !"); |
| } |
| |
| //------------------------------------------------------------------------- |
| ODsnTypeCollection::~ODsnTypeCollection() |
| { |
| DBG_DTOR(ODsnTypeCollection,NULL); |
| DBG_ASSERT(0 == m_nLivingIterators, "ODsnTypeCollection::~ODsnTypeCollection : there are still living iterator objects!"); |
| } |
| //------------------------------------------------------------------------- |
| String ODsnTypeCollection::getTypeDisplayName(const ::rtl::OUString& _sURL) const |
| { |
| return m_aDriverConfig.getDriverTypeDisplayName(_sURL); |
| } |
| //------------------------------------------------------------------------- |
| String ODsnTypeCollection::cutPrefix(const ::rtl::OUString& _sURL) const |
| { |
| String sURL( _sURL); |
| String sRet; |
| String sOldPattern; |
| StringVector::const_iterator aIter = m_aDsnPrefixes.begin(); |
| StringVector::const_iterator aEnd = m_aDsnPrefixes.end(); |
| for(;aIter != aEnd;++aIter) |
| { |
| WildCard aWildCard(*aIter); |
| if ( sOldPattern.Len() < aIter->Len() && aWildCard.Matches(_sURL) ) |
| { |
| if ( aIter->Len() < sURL.Len() ) |
| sRet = sURL.Copy(sURL.Match(*aIter)); |
| else |
| sRet = sURL.Copy(aIter->Match(sURL)); |
| sOldPattern = *aIter; |
| } |
| } |
| |
| return sRet; |
| } |
| |
| //------------------------------------------------------------------------- |
| String ODsnTypeCollection::getPrefix(const ::rtl::OUString& _sURL) const |
| { |
| String sURL( _sURL); |
| String sRet; |
| String sOldPattern; |
| StringVector::const_iterator aIter = m_aDsnPrefixes.begin(); |
| StringVector::const_iterator aEnd = m_aDsnPrefixes.end(); |
| for(;aIter != aEnd;++aIter) |
| { |
| WildCard aWildCard(*aIter); |
| if ( sOldPattern.Len() < aIter->Len() && aWildCard.Matches(sURL) ) |
| { |
| if ( aIter->Len() < sURL.Len() ) |
| sRet = aIter->Copy(0,sURL.Match(*aIter)); |
| else |
| sRet = sURL.Copy(0,aIter->Match(sURL)); |
| sRet.EraseTrailingChars('*'); |
| sOldPattern = *aIter; |
| } |
| } |
| |
| return sRet; |
| } |
| |
| //------------------------------------------------------------------------- |
| bool ODsnTypeCollection::hasDriver( const sal_Char* _pAsciiPattern ) const |
| { |
| String sPrefix( getPrefix( ::rtl::OUString::createFromAscii( _pAsciiPattern ) ) ); |
| return ( sPrefix.Len() > 0 ); |
| } |
| |
| // ----------------------------------------------------------------------------- |
| bool ODsnTypeCollection::isConnectionUrlRequired(const ::rtl::OUString& _sURL) const |
| { |
| String sURL( _sURL); |
| String sRet; |
| String sOldPattern; |
| StringVector::const_iterator aIter = m_aDsnPrefixes.begin(); |
| StringVector::const_iterator aEnd = m_aDsnPrefixes.end(); |
| for(;aIter != aEnd;++aIter) |
| { |
| WildCard aWildCard(*aIter); |
| if ( sOldPattern.Len() < aIter->Len() && aWildCard.Matches(sURL) ) |
| { |
| sRet = *aIter; |
| sOldPattern = *aIter; |
| } |
| } // for(;aIter != aEnd;++aIter) |
| return sRet.GetChar(sRet.Len()-1) == '*'; |
| } |
| // ----------------------------------------------------------------------------- |
| String ODsnTypeCollection::getMediaType(const ::rtl::OUString& _sURL) const |
| { |
| const ::comphelper::NamedValueCollection& aFeatures = m_aDriverConfig.getMetaData(_sURL); |
| return aFeatures.getOrDefault("MediaType",::rtl::OUString()); |
| } |
| // ----------------------------------------------------------------------------- |
| String ODsnTypeCollection::getDatasourcePrefixFromMediaType(const ::rtl::OUString& _sMediaType,const ::rtl::OUString& _sExtension) |
| { |
| String sURL, sFallbackURL; |
| const uno::Sequence< ::rtl::OUString > aURLs = m_aDriverConfig.getURLs(); |
| const ::rtl::OUString* pIter = aURLs.getConstArray(); |
| const ::rtl::OUString* pEnd = pIter + aURLs.getLength(); |
| for(;pIter != pEnd;++pIter ) |
| { |
| const ::comphelper::NamedValueCollection& aFeatures = m_aDriverConfig.getMetaData(*pIter); |
| if ( aFeatures.getOrDefault("MediaType",::rtl::OUString()) == _sMediaType ) |
| { |
| const ::rtl::OUString sFileExtension = aFeatures.getOrDefault("Extension",::rtl::OUString()); |
| if ( _sExtension == sFileExtension ) |
| { |
| sURL = *pIter; |
| break; |
| } |
| if ( !sFileExtension.getLength() && _sExtension.getLength() ) |
| sFallbackURL = *pIter; |
| } |
| } // for(;pIter != pEnd;++pIter ) |
| |
| if ( !sURL.Len() && sFallbackURL.Len() ) |
| sURL = sFallbackURL; |
| |
| sURL.EraseTrailingChars('*'); |
| return sURL; |
| } |
| // ----------------------------------------------------------------------------- |
| bool ODsnTypeCollection::isShowPropertiesEnabled( const ::rtl::OUString& _sURL ) const |
| { |
| return !( _sURL.matchIgnoreAsciiCaseAsciiL("sdbc:embedded:hsqldb",sizeof("sdbc:embedded:hsqldb")-1) |
| || _sURL.matchIgnoreAsciiCaseAsciiL("sdbc:address:outlook",sizeof("sdbc:address:outlook")-1) |
| || _sURL.matchIgnoreAsciiCaseAsciiL("sdbc:address:outlookexp",sizeof("sdbc:address:outlookexp")-1) |
| || _sURL.matchIgnoreAsciiCaseAsciiL("sdbc:address:mozilla:",sizeof("sdbc:address:mozilla:")-1) |
| || _sURL.matchIgnoreAsciiCaseAsciiL("sdbc:address:kab",sizeof("sdbc:address:kab")-1) |
| || _sURL.matchIgnoreAsciiCaseAsciiL("sdbc:address:evolution:local",sizeof("sdbc:address:evolution:local")-1) |
| || _sURL.matchIgnoreAsciiCaseAsciiL("sdbc:address:evolution:groupwise",sizeof("sdbc:address:evolution:groupwise")-1) |
| || _sURL.matchIgnoreAsciiCaseAsciiL("sdbc:address:evolution:ldap",sizeof("sdbc:address:evolution:ldap")-1) |
| || _sURL.matchIgnoreAsciiCaseAsciiL("sdbc:address:macab",sizeof("sdbc:address:macab")-1) ); |
| } |
| // ----------------------------------------------------------------------------- |
| void ODsnTypeCollection::extractHostNamePort(const ::rtl::OUString& _rDsn,String& _sDatabaseName,String& _rsHostname,sal_Int32& _nPortNumber) const |
| { |
| String sUrl = cutPrefix(_rDsn); |
| if ( _rDsn.matchIgnoreAsciiCaseAsciiL("jdbc:oracle:thin:",sizeof("jdbc:oracle:thin:")-1) ) |
| { |
| lcl_extractHostAndPort(sUrl,_rsHostname,_nPortNumber); |
| if ( !_rsHostname.Len() && sUrl.GetTokenCount(':') == 2 ) |
| { |
| _nPortNumber = -1; |
| _rsHostname = sUrl.GetToken(0,':'); |
| } |
| if ( _rsHostname.Len() ) |
| _rsHostname = _rsHostname.GetToken(_rsHostname.GetTokenCount('@') - 1,'@'); |
| _sDatabaseName = sUrl.GetToken(sUrl.GetTokenCount(':') - 1,':'); |
| } // if ( _rDsn.matchIgnoreAsciiCaseAsciiL("jdbc:oracle:thin:",sizeof("jdbc:oracle:thin:")-1) ) |
| else if ( _rDsn.matchIgnoreAsciiCaseAsciiL("sdbc:address:ldap:",sizeof("sdbc:address:ldap:")-1) ) |
| { |
| lcl_extractHostAndPort(sUrl,_sDatabaseName,_nPortNumber); |
| } |
| else if ( _rDsn.matchIgnoreAsciiCaseAsciiL("sdbc:adabas:",sizeof("sdbc:adabas:")-1) ) |
| { |
| if ( sUrl.GetTokenCount(':') == 2 ) |
| _rsHostname = sUrl.GetToken(0,':'); |
| _sDatabaseName = sUrl.GetToken(sUrl.GetTokenCount(':') - 1,':'); |
| } |
| else if ( _rDsn.matchIgnoreAsciiCaseAsciiL("sdbc:mysql:mysqlc:",sizeof("sdbc:mysql:mysqlc:")-1) || _rDsn.matchIgnoreAsciiCaseAsciiL("sdbc:mysql:jdbc:",sizeof("sdbc:mysql:jdbc:")-1) ) |
| { |
| lcl_extractHostAndPort(sUrl,_rsHostname,_nPortNumber); |
| |
| if ( _nPortNumber == -1 && !_rsHostname.Len() && sUrl.GetTokenCount('/') == 2 ) |
| _rsHostname = sUrl.GetToken(0,'/'); |
| _sDatabaseName = sUrl.GetToken(sUrl.GetTokenCount('/') - 1,'/'); |
| } |
| else if ( _rDsn.matchIgnoreAsciiCaseAsciiL("sdbc:ado:access:Provider=Microsoft.ACE.OLEDB.12.0;DATA SOURCE=",sizeof("sdbc:ado:access:Provider=Microsoft.ACE.OLEDB.12.0;DATA SOURCE=")-1) |
| || _rDsn.matchIgnoreAsciiCaseAsciiL("sdbc:ado:access:PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=",sizeof("sdbc:ado:access:PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=")-1)) |
| { |
| ::rtl::OUString sNewFileName; |
| if ( ::osl::FileBase::getFileURLFromSystemPath( sUrl, sNewFileName ) == ::osl::FileBase::E_None ) |
| { |
| _sDatabaseName = sNewFileName; |
| } |
| } |
| } |
| // ----------------------------------------------------------------------------- |
| String ODsnTypeCollection::getJavaDriverClass(const ::rtl::OUString& _sURL) const |
| { |
| const ::comphelper::NamedValueCollection& aFeatures = m_aDriverConfig.getProperties(_sURL); |
| return aFeatures.getOrDefault("JavaDriverClass",::rtl::OUString()); |
| } |
| //------------------------------------------------------------------------- |
| sal_Bool ODsnTypeCollection::isFileSystemBased(const ::rtl::OUString& _sURL) const |
| { |
| const ::comphelper::NamedValueCollection& aFeatures = m_aDriverConfig.getMetaData(_sURL); |
| return aFeatures.getOrDefault("FileSystemBased",sal_False); |
| } |
| // ----------------------------------------------------------------------------- |
| sal_Bool ODsnTypeCollection::supportsTableCreation(const ::rtl::OUString& _sURL) const |
| { |
| const ::comphelper::NamedValueCollection& aFeatures = m_aDriverConfig.getMetaData(_sURL); |
| return aFeatures.getOrDefault("SupportsTableCreation",sal_False); |
| } |
| // ----------------------------------------------------------------------------- |
| sal_Bool ODsnTypeCollection::supportsColumnDescription(const ::rtl::OUString& _sURL) const |
| { |
| const ::comphelper::NamedValueCollection& aFeatures = m_aDriverConfig.getMetaData(_sURL); |
| return aFeatures.getOrDefault("SupportsColumnDescription",sal_False); |
| } |
| // ----------------------------------------------------------------------------- |
| sal_Bool ODsnTypeCollection::supportsBrowsing(const ::rtl::OUString& _sURL) const |
| { |
| const ::comphelper::NamedValueCollection& aFeatures = m_aDriverConfig.getMetaData(_sURL); |
| return aFeatures.getOrDefault("SupportsBrowsing",sal_False); |
| } |
| // ----------------------------------------------------------------------------- |
| bool ODsnTypeCollection::needsJVM(const String& _sURL) const |
| { |
| const ::comphelper::NamedValueCollection& aFeatures = m_aDriverConfig.getMetaData(_sURL); |
| return aFeatures.getOrDefault("UseJava",sal_False); |
| } |
| // ----------------------------------------------------------------------------- |
| Sequence<PropertyValue> ODsnTypeCollection::getDefaultDBSettings( const ::rtl::OUString& _sURL ) const |
| { |
| const ::comphelper::NamedValueCollection& aProperties = m_aDriverConfig.getProperties(_sURL); |
| return aProperties.getPropertyValues(); |
| } |
| |
| //------------------------------------------------------------------------- |
| bool ODsnTypeCollection::isEmbeddedDatabase( const ::rtl::OUString& _sURL ) const |
| { |
| const ::rtl::OUString sEmbeddedDatabaseURL = getEmbeddedDatabase(); |
| WildCard aWildCard(sEmbeddedDatabaseURL); |
| return aWildCard.Matches(_sURL); |
| } |
| // ----------------------------------------------------------------------------- |
| ::rtl::OUString ODsnTypeCollection::getEmbeddedDatabase() const |
| { |
| ::rtl::OUString sEmbeddedDatabaseURL; |
| static const ::rtl::OUString s_sNodeName(RTL_CONSTASCII_USTRINGPARAM("org.openoffice.Office.DataAccess")); ///Installed |
| const ::utl::OConfigurationTreeRoot aInstalled = ::utl::OConfigurationTreeRoot::createWithServiceFactory(m_xFactory, s_sNodeName, -1, ::utl::OConfigurationTreeRoot::CM_READONLY); |
| if ( aInstalled.isValid() ) |
| { |
| if ( aInstalled.hasByName("EmbeddedDatabases/DefaultEmbeddedDatabase/Value") ) |
| { |
| static const ::rtl::OUString s_sValue(RTL_CONSTASCII_USTRINGPARAM("EmbeddedDatabases/DefaultEmbeddedDatabase/Value")); |
| |
| aInstalled.getNodeValue(s_sValue) >>= sEmbeddedDatabaseURL; |
| if ( sEmbeddedDatabaseURL.getLength() ) |
| aInstalled.getNodeValue(s_sValue + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/")) + sEmbeddedDatabaseURL + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/URL"))) >>= sEmbeddedDatabaseURL; |
| } |
| } // if ( aInstalled.isValid() ) |
| if ( !sEmbeddedDatabaseURL.getLength() ) |
| sEmbeddedDatabaseURL = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("sdbc:embedded:hsqldb")); |
| return sEmbeddedDatabaseURL; |
| } |
| //------------------------------------------------------------------------- |
| ODsnTypeCollection::TypeIterator ODsnTypeCollection::begin() const |
| { |
| return TypeIterator(this, 0); |
| } |
| |
| //------------------------------------------------------------------------- |
| ODsnTypeCollection::TypeIterator ODsnTypeCollection::end() const |
| { |
| return TypeIterator(this, m_aDsnTypesDisplayNames.size()); |
| } |
| //------------------------------------------------------------------------- |
| DATASOURCE_TYPE ODsnTypeCollection::determineType(const String& _rDsn) const |
| { |
| String sDsn(_rDsn); |
| sDsn.EraseTrailingChars('*'); |
| sal_uInt16 nSeparator = sDsn.Search((sal_Unicode)':'); |
| if (STRING_NOTFOUND == nSeparator) |
| { |
| // there should be at least one such separator |
| DBG_ERROR("ODsnTypeCollection::implDetermineType : missing the colon !"); |
| return DST_UNKNOWN; |
| } |
| // find first : |
| sal_uInt16 nOracleSeparator = sDsn.Search((sal_Unicode)':', nSeparator + 1); |
| if ( nOracleSeparator != STRING_NOTFOUND ) |
| { |
| nOracleSeparator = sDsn.Search((sal_Unicode)':', nOracleSeparator + 1); |
| if (nOracleSeparator != STRING_NOTFOUND && sDsn.EqualsIgnoreCaseAscii("jdbc:oracle:thin", 0, nOracleSeparator)) |
| return DST_ORACLE_JDBC; |
| } |
| |
| if (sDsn.EqualsIgnoreCaseAscii("jdbc", 0, nSeparator)) |
| return DST_JDBC; |
| |
| if (sDsn.EqualsIgnoreCaseAscii("sdbc:embedded:hsqldb", 0, sDsn.Len())) |
| return DST_EMBEDDED_HSQLDB; |
| |
| // find second : |
| nSeparator = sDsn.Search((sal_Unicode)':', nSeparator + 1); |
| if (STRING_NOTFOUND == nSeparator) |
| { |
| // at the moment only jdbc is allowed to have just one separator |
| DBG_ERROR("ODsnTypeCollection::implDetermineType : missing the second colon !"); |
| return DST_UNKNOWN; |
| } |
| |
| if (sDsn.EqualsIgnoreCaseAscii("sdbc:ado:", 0, nSeparator)) |
| { |
| nSeparator = sDsn.Search((sal_Unicode)':', nSeparator + 1); |
| if (STRING_NOTFOUND != nSeparator && sDsn.EqualsIgnoreCaseAscii("sdbc:ado:access",0, nSeparator) ) |
| { |
| nSeparator = sDsn.Search((sal_Unicode)';', nSeparator + 1); |
| if (STRING_NOTFOUND != nSeparator && sDsn.EqualsIgnoreCaseAscii("sdbc:ado:access:Provider=Microsoft.ACE.OLEDB.12.0",0, nSeparator) ) |
| return DST_MSACCESS_2007; |
| |
| return DST_MSACCESS; |
| } |
| return DST_ADO; |
| } |
| |
| struct KnownPrefix |
| { |
| const sal_Char* pAsciiPrefix; |
| const DATASOURCE_TYPE eType; |
| const bool bMatchComplete; |
| |
| KnownPrefix() |
| :pAsciiPrefix( NULL ) |
| ,eType( DST_UNKNOWN ) |
| ,bMatchComplete( false ) |
| { |
| } |
| KnownPrefix( const sal_Char* _p, const DATASOURCE_TYPE _t, const bool _m ) |
| :pAsciiPrefix( _p ) |
| ,eType ( _t ) |
| ,bMatchComplete( _m ) |
| { |
| } |
| }; |
| KnownPrefix aKnowPrefixes[] = |
| { |
| KnownPrefix( "sdbc:calc:", DST_CALC, false ), |
| KnownPrefix( "sdbc:flat:", DST_FLAT, false ), |
| KnownPrefix( "sdbc:adabas:", DST_ADABAS, false ), |
| KnownPrefix( "sdbc:odbc:", DST_ODBC, false ), |
| KnownPrefix( "sdbc:dbase:", DST_DBASE, false ), |
| KnownPrefix( "sdbc:mysql:odbc:", DST_MYSQL_ODBC, false ), |
| KnownPrefix( "sdbc:mysql:jdbc:", DST_MYSQL_JDBC, false ), |
| KnownPrefix( "sdbc:mysql:mysqlc:", DST_MYSQL_NATIVE, false ), |
| KnownPrefix( "sdbc:mysqlc:", DST_MYSQL_NATIVE_DIRECT,false ), |
| |
| KnownPrefix( "sdbc:address:mozilla:", DST_MOZILLA, true ), |
| KnownPrefix( "sdbc:address:thunderbird:", DST_THUNDERBIRD, true ), |
| KnownPrefix( "sdbc:address:ldap:", DST_LDAP, true ), |
| KnownPrefix( "sdbc:address:outlook", DST_OUTLOOK, true ), |
| KnownPrefix( "sdbc:address:outlookexp", DST_OUTLOOKEXP, true ), |
| KnownPrefix( "sdbc:address:evolution:ldap", DST_EVOLUTION_LDAP, true ), |
| KnownPrefix( "sdbc:address:evolution:groupwise",DST_EVOLUTION_GROUPWISE,true ), |
| KnownPrefix( "sdbc:address:evolution:local", DST_EVOLUTION, true ), |
| KnownPrefix( "sdbc:address:kab", DST_KAB, true ), |
| KnownPrefix( "sdbc:address:macab", DST_MACAB, true ) |
| }; |
| |
| for ( size_t i=0; i < sizeof( aKnowPrefixes ) / sizeof( aKnowPrefixes[0] ); ++i ) |
| { |
| sal_uInt16 nMatchLen = aKnowPrefixes[i].bMatchComplete ? sDsn.Len() : (sal_uInt16)rtl_str_getLength( aKnowPrefixes[i].pAsciiPrefix ); |
| if ( sDsn.EqualsIgnoreCaseAscii( aKnowPrefixes[i].pAsciiPrefix, 0, nMatchLen ) ) |
| return aKnowPrefixes[i].eType; |
| } |
| |
| return DST_UNKNOWN; |
| } |
| // ----------------------------------------------------------------------------- |
| void ODsnTypeCollection::fillPageIds(const ::rtl::OUString& _sURL,::std::vector<sal_Int16>& _rOutPathIds) const |
| { |
| DATASOURCE_TYPE eType = determineType(_sURL); |
| switch(eType) |
| { |
| case DST_ADO: |
| _rOutPathIds.push_back(PAGE_DBSETUPWIZARD_ADO); |
| break; |
| case DST_DBASE: |
| _rOutPathIds.push_back(PAGE_DBSETUPWIZARD_DBASE); |
| break; |
| case DST_FLAT: |
| _rOutPathIds.push_back(PAGE_DBSETUPWIZARD_TEXT); |
| break; |
| case DST_CALC: |
| _rOutPathIds.push_back(PAGE_DBSETUPWIZARD_SPREADSHEET); |
| break; |
| case DST_ODBC: |
| _rOutPathIds.push_back(PAGE_DBSETUPWIZARD_ODBC); |
| break; |
| case DST_JDBC: |
| _rOutPathIds.push_back(PAGE_DBSETUPWIZARD_JDBC); |
| break; |
| case DST_MYSQL_ODBC: |
| _rOutPathIds.push_back(PAGE_DBSETUPWIZARD_MYSQL_INTRO); |
| _rOutPathIds.push_back(PAGE_DBSETUPWIZARD_MYSQL_ODBC); |
| break; |
| case DST_MYSQL_JDBC: |
| _rOutPathIds.push_back(PAGE_DBSETUPWIZARD_MYSQL_INTRO); |
| _rOutPathIds.push_back(PAGE_DBSETUPWIZARD_MYSQL_JDBC); |
| break; |
| case DST_MYSQL_NATIVE: |
| _rOutPathIds.push_back(PAGE_DBSETUPWIZARD_MYSQL_INTRO); |
| _rOutPathIds.push_back(PAGE_DBSETUPWIZARD_MYSQL_NATIVE); |
| break; |
| case DST_ORACLE_JDBC: |
| _rOutPathIds.push_back(PAGE_DBSETUPWIZARD_ORACLE); |
| break; |
| case DST_ADABAS: |
| _rOutPathIds.push_back(PAGE_DBSETUPWIZARD_ADABAS); |
| break; |
| case DST_LDAP: |
| _rOutPathIds.push_back(PAGE_DBSETUPWIZARD_LDAP); |
| break; |
| case DST_MSACCESS: |
| case DST_MSACCESS_2007: |
| _rOutPathIds.push_back(PAGE_DBSETUPWIZARD_MSACCESS); |
| break; |
| case DST_OUTLOOKEXP: |
| case DST_OUTLOOK: |
| case DST_MOZILLA: |
| case DST_THUNDERBIRD: |
| case DST_EVOLUTION: |
| case DST_EVOLUTION_GROUPWISE: |
| case DST_EVOLUTION_LDAP: |
| case DST_KAB: |
| case DST_MACAB: |
| case DST_EMBEDDED_HSQLDB: |
| break; |
| default: |
| _rOutPathIds.push_back(PAGE_DBSETUPWIZARD_USERDEFINED); |
| break; |
| } |
| } |
| // ----------------------------------------------------------------------------- |
| ::rtl::OUString ODsnTypeCollection::getType(const ::rtl::OUString& _sURL) const |
| { |
| ::rtl::OUString sOldPattern; |
| StringVector::const_iterator aIter = m_aDsnPrefixes.begin(); |
| StringVector::const_iterator aEnd = m_aDsnPrefixes.end(); |
| for(;aIter != aEnd;++aIter) |
| { |
| WildCard aWildCard(*aIter); |
| if ( sOldPattern.getLength() < aIter->Len() && aWildCard.Matches(_sURL) ) |
| { |
| sOldPattern = *aIter; |
| } |
| } // for(sal_Int32 i = 0;aIter != aEnd;++aIter,++i) |
| return sOldPattern; |
| } |
| // ----------------------------------------------------------------------------- |
| sal_Int32 ODsnTypeCollection::getIndexOf(const ::rtl::OUString& _sURL) const |
| { |
| sal_Int32 nRet = -1; |
| String sURL( _sURL); |
| String sOldPattern; |
| StringVector::const_iterator aIter = m_aDsnPrefixes.begin(); |
| StringVector::const_iterator aEnd = m_aDsnPrefixes.end(); |
| for(sal_Int32 i = 0;aIter != aEnd;++aIter,++i) |
| { |
| WildCard aWildCard(*aIter); |
| if ( sOldPattern.Len() < aIter->Len() && aWildCard.Matches(sURL) ) |
| { |
| nRet = i; |
| sOldPattern = *aIter; |
| } |
| } |
| |
| return nRet; |
| } |
| // ----------------------------------------------------------------------------- |
| sal_Int32 ODsnTypeCollection::size() const |
| { |
| return m_aDsnPrefixes.size(); |
| } |
| //========================================================================= |
| //= ODsnTypeCollection::TypeIterator |
| //========================================================================= |
| //------------------------------------------------------------------------- |
| ODsnTypeCollection::TypeIterator::TypeIterator(const ODsnTypeCollection* _pContainer, sal_Int32 _nInitialPos) |
| :m_pContainer(_pContainer) |
| ,m_nPosition(_nInitialPos) |
| { |
| DBG_ASSERT(m_pContainer, "ODsnTypeCollection::TypeIterator::TypeIterator : invalid container!"); |
| #ifdef DBG_UTIL |
| ++const_cast<ODsnTypeCollection*>(m_pContainer)->m_nLivingIterators; |
| #endif |
| } |
| |
| //------------------------------------------------------------------------- |
| ODsnTypeCollection::TypeIterator::TypeIterator(const TypeIterator& _rSource) |
| :m_pContainer(_rSource.m_pContainer) |
| ,m_nPosition(_rSource.m_nPosition) |
| { |
| #ifdef DBG_UTIL |
| ++const_cast<ODsnTypeCollection*>(m_pContainer)->m_nLivingIterators; |
| #endif |
| } |
| |
| //------------------------------------------------------------------------- |
| ODsnTypeCollection::TypeIterator::~TypeIterator() |
| { |
| #ifdef DBG_UTIL |
| --const_cast<ODsnTypeCollection*>(m_pContainer)->m_nLivingIterators; |
| #endif |
| } |
| |
| //------------------------------------------------------------------------- |
| String ODsnTypeCollection::TypeIterator::getDisplayName() const |
| { |
| DBG_ASSERT(m_nPosition < (sal_Int32)m_pContainer->m_aDsnTypesDisplayNames.size(), "ODsnTypeCollection::TypeIterator::getDisplayName : invalid position!"); |
| return m_pContainer->m_aDsnTypesDisplayNames[m_nPosition]; |
| } |
| // ----------------------------------------------------------------------------- |
| ::rtl::OUString ODsnTypeCollection::TypeIterator::getURLPrefix() const |
| { |
| DBG_ASSERT(m_nPosition < (sal_Int32)m_pContainer->m_aDsnPrefixes.size(), "ODsnTypeCollection::TypeIterator::getDisplayName : invalid position!"); |
| return m_pContainer->m_aDsnPrefixes[m_nPosition]; |
| } |
| //------------------------------------------------------------------------- |
| const ODsnTypeCollection::TypeIterator& ODsnTypeCollection::TypeIterator::operator++() |
| { |
| DBG_ASSERT(m_nPosition < (sal_Int32)m_pContainer->m_aDsnTypesDisplayNames.size(), "ODsnTypeCollection::TypeIterator::operator++ : invalid position!"); |
| if (m_nPosition < (sal_Int32)m_pContainer->m_aDsnTypesDisplayNames.size()) |
| ++m_nPosition; |
| return *this; |
| } |
| |
| //------------------------------------------------------------------------- |
| const ODsnTypeCollection::TypeIterator& ODsnTypeCollection::TypeIterator::operator--() |
| { |
| DBG_ASSERT(m_nPosition >= 0, "ODsnTypeCollection::TypeIterator::operator-- : invalid position!"); |
| if (m_nPosition >= 0) |
| --m_nPosition; |
| return *this; |
| } |
| |
| //------------------------------------------------------------------------- |
| bool operator==(const ODsnTypeCollection::TypeIterator& lhs, const ODsnTypeCollection::TypeIterator& rhs) |
| { |
| return (lhs.m_pContainer == rhs.m_pContainer) && (lhs.m_nPosition == rhs.m_nPosition); |
| } |
| |
| //......................................................................... |
| } // namespace dbaccess |
| //......................................................................... |
| |