1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 #include "connectivity/DriversConfig.hxx" 28 #include <tools/wldcrd.hxx> 29 30 using namespace connectivity; 31 using namespace utl; 32 using namespace ::com::sun::star; 33 34 namespace 35 { 36 void lcl_convert(const uno::Sequence< ::rtl::OUString >& _aSource,uno::Any& _rDest) 37 { 38 uno::Sequence<uno::Any> aRet(_aSource.getLength()); 39 uno::Any* pAny = aRet.getArray(); 40 const ::rtl::OUString* pIter = _aSource.getConstArray(); 41 const ::rtl::OUString* pEnd = pIter + _aSource.getLength(); 42 for (;pIter != pEnd ; ++pIter,++pAny) 43 { 44 *pAny <<= *pIter; 45 } 46 _rDest <<= aRet; 47 } 48 void lcl_fillValues(const ::utl::OConfigurationNode& _aURLPatternNode,const ::rtl::OUString& _sNode,::comphelper::NamedValueCollection& _rValues) 49 { 50 const ::utl::OConfigurationNode aPropertiesNode = _aURLPatternNode.openNode(_sNode); 51 if ( aPropertiesNode.isValid() ) 52 { 53 uno::Sequence< ::rtl::OUString > aStringSeq; 54 static const ::rtl::OUString s_sValue(RTL_CONSTASCII_USTRINGPARAM("/Value")); 55 const uno::Sequence< ::rtl::OUString > aProperties = aPropertiesNode.getNodeNames(); 56 const ::rtl::OUString* pPropertiesIter = aProperties.getConstArray(); 57 const ::rtl::OUString* pPropertiesEnd = pPropertiesIter + aProperties.getLength(); 58 for (;pPropertiesIter != pPropertiesEnd ; ++pPropertiesIter) 59 { 60 uno::Any aValue = aPropertiesNode.getNodeValue(*pPropertiesIter + s_sValue); 61 if ( aValue >>= aStringSeq ) 62 { 63 lcl_convert(aStringSeq,aValue); 64 } 65 _rValues.put(*pPropertiesIter,aValue); 66 } // for (;pPropertiesIter != pPropertiesEnd ; ++pPropertiesIter,++pNamedIter) 67 } // if ( aPropertiesNode.isValid() ) 68 } 69 void lcl_readURLPatternNode(const ::utl::OConfigurationTreeRoot& _aInstalled,const ::rtl::OUString& _sEntry,TInstalledDriver& _rInstalledDriver) 70 { 71 const ::utl::OConfigurationNode aURLPatternNode = _aInstalled.openNode(_sEntry); 72 if ( aURLPatternNode.isValid() ) 73 { 74 static const ::rtl::OUString s_sParentURLPattern(RTL_CONSTASCII_USTRINGPARAM("ParentURLPattern")); 75 static const ::rtl::OUString s_sDriver(RTL_CONSTASCII_USTRINGPARAM("Driver")); 76 static const ::rtl::OUString s_sDriverTypeDisplayName(RTL_CONSTASCII_USTRINGPARAM("DriverTypeDisplayName")); 77 static const ::rtl::OUString s_sProperties(RTL_CONSTASCII_USTRINGPARAM("Properties")); 78 static const ::rtl::OUString s_sFeatures(RTL_CONSTASCII_USTRINGPARAM("Features")); 79 static const ::rtl::OUString s_sMetaData(RTL_CONSTASCII_USTRINGPARAM("MetaData")); 80 ::rtl::OUString sParentURLPattern; 81 aURLPatternNode.getNodeValue(s_sParentURLPattern) >>= sParentURLPattern; 82 if ( sParentURLPattern.getLength() ) 83 lcl_readURLPatternNode(_aInstalled,sParentURLPattern,_rInstalledDriver); 84 85 ::rtl::OUString sDriverFactory; 86 aURLPatternNode.getNodeValue(s_sDriver) >>= sDriverFactory; 87 if ( sDriverFactory.getLength() ) 88 _rInstalledDriver.sDriverFactory = sDriverFactory; 89 90 ::rtl::OUString sDriverTypeDisplayName; 91 aURLPatternNode.getNodeValue(s_sDriverTypeDisplayName) >>= sDriverTypeDisplayName; 92 OSL_ENSURE(sDriverTypeDisplayName.getLength(),"No valid DriverTypeDisplayName property!"); 93 if ( sDriverTypeDisplayName.getLength() ) 94 _rInstalledDriver.sDriverTypeDisplayName = sDriverTypeDisplayName; 95 96 lcl_fillValues(aURLPatternNode,s_sProperties,_rInstalledDriver.aProperties); 97 lcl_fillValues(aURLPatternNode,s_sFeatures,_rInstalledDriver.aFeatures); 98 lcl_fillValues(aURLPatternNode,s_sMetaData,_rInstalledDriver.aMetaData); 99 } 100 } 101 } 102 // ----------------------------------------------------------------------------- 103 DriversConfigImpl::DriversConfigImpl() 104 { 105 } 106 // ----------------------------------------------------------------------------- 107 void DriversConfigImpl::Load(const uno::Reference< lang::XMultiServiceFactory >& _rxORB) const 108 { 109 if ( m_aDrivers.empty() ) 110 { 111 if ( !m_aInstalled.isValid() ) 112 { 113 static const ::rtl::OUString s_sNodeName(RTL_CONSTASCII_USTRINGPARAM("org.openoffice.Office.DataAccess.Drivers/Installed")); ///Installed 114 m_aInstalled = ::utl::OConfigurationTreeRoot::createWithServiceFactory(_rxORB, s_sNodeName, -1, ::utl::OConfigurationTreeRoot::CM_READONLY); 115 } 116 117 if ( m_aInstalled.isValid() ) 118 { 119 const uno::Sequence< ::rtl::OUString > aURLPatterns = m_aInstalled.getNodeNames(); 120 const ::rtl::OUString* pPatternIter = aURLPatterns.getConstArray(); 121 const ::rtl::OUString* pPatternEnd = pPatternIter + aURLPatterns.getLength(); 122 for (;pPatternIter != pPatternEnd ; ++pPatternIter) 123 { 124 TInstalledDriver aInstalledDriver; 125 lcl_readURLPatternNode(m_aInstalled,*pPatternIter,aInstalledDriver); 126 if ( aInstalledDriver.sDriverFactory.getLength() ) 127 m_aDrivers.insert(TInstalledDrivers::value_type(*pPatternIter,aInstalledDriver)); 128 } 129 } // if ( m_aInstalled.isValid() ) 130 } 131 } 132 // ----------------------------------------------------------------------------- 133 DriversConfig::DriversConfig(const uno::Reference< lang::XMultiServiceFactory >& _rxORB) 134 :m_xORB(_rxORB) 135 { 136 } 137 138 // ----------------------------------------------------------------------------- 139 DriversConfig::~DriversConfig() 140 { 141 } 142 143 // ----------------------------------------------------------------------------- 144 DriversConfig::DriversConfig( const DriversConfig& _rhs ) 145 { 146 *this = _rhs; 147 } 148 149 // ----------------------------------------------------------------------------- 150 DriversConfig& DriversConfig::operator=( const DriversConfig& _rhs ) 151 { 152 if ( this != &_rhs ) 153 { 154 m_aNode = _rhs.m_aNode; 155 } 156 return *this; 157 } 158 159 // ----------------------------------------------------------------------------- 160 ::rtl::OUString DriversConfig::getDriverFactoryName(const ::rtl::OUString& _sURL) const 161 { 162 const TInstalledDrivers& rDrivers = m_aNode->getInstalledDrivers(m_xORB); 163 ::rtl::OUString sRet; 164 ::rtl::OUString sOldPattern; 165 TInstalledDrivers::const_iterator aIter = rDrivers.begin(); 166 TInstalledDrivers::const_iterator aEnd = rDrivers.end(); 167 for(;aIter != aEnd;++aIter) 168 { 169 WildCard aWildCard(aIter->first); 170 if ( sOldPattern.getLength() < aIter->first.getLength() && aWildCard.Matches(_sURL) ) 171 { 172 sRet = aIter->second.sDriverFactory; 173 sOldPattern = aIter->first; 174 } 175 } 176 177 return sRet; 178 } 179 // ----------------------------------------------------------------------------- 180 ::rtl::OUString DriversConfig::getDriverTypeDisplayName(const ::rtl::OUString& _sURL) const 181 { 182 const TInstalledDrivers& rDrivers = m_aNode->getInstalledDrivers(m_xORB); 183 ::rtl::OUString sRet; 184 ::rtl::OUString sOldPattern; 185 TInstalledDrivers::const_iterator aIter = rDrivers.begin(); 186 TInstalledDrivers::const_iterator aEnd = rDrivers.end(); 187 for(;aIter != aEnd;++aIter) 188 { 189 WildCard aWildCard(aIter->first); 190 if ( sOldPattern.getLength() < aIter->first.getLength() && aWildCard.Matches(_sURL) ) 191 { 192 sRet = aIter->second.sDriverTypeDisplayName; 193 sOldPattern = aIter->first; 194 } 195 } 196 197 return sRet; 198 } 199 // ----------------------------------------------------------------------------- 200 const ::comphelper::NamedValueCollection& DriversConfig::getProperties(const ::rtl::OUString& _sURL) const 201 { 202 return impl_get(_sURL,1); 203 } 204 // ----------------------------------------------------------------------------- 205 const ::comphelper::NamedValueCollection& DriversConfig::getFeatures(const ::rtl::OUString& _sURL) const 206 { 207 return impl_get(_sURL,0); 208 } 209 // ----------------------------------------------------------------------------- 210 const ::comphelper::NamedValueCollection& DriversConfig::getMetaData(const ::rtl::OUString& _sURL) const 211 { 212 return impl_get(_sURL,2); 213 } 214 // ----------------------------------------------------------------------------- 215 const ::comphelper::NamedValueCollection& DriversConfig::impl_get(const ::rtl::OUString& _sURL,sal_Int32 _nProps) const 216 { 217 const TInstalledDrivers& rDrivers = m_aNode->getInstalledDrivers(m_xORB); 218 const ::comphelper::NamedValueCollection* pRet = NULL; 219 ::rtl::OUString sOldPattern; 220 TInstalledDrivers::const_iterator aIter = rDrivers.begin(); 221 TInstalledDrivers::const_iterator aEnd = rDrivers.end(); 222 for(;aIter != aEnd;++aIter) 223 { 224 WildCard aWildCard(aIter->first); 225 if ( sOldPattern.getLength() < aIter->first.getLength() && aWildCard.Matches(_sURL) ) 226 { 227 switch(_nProps) 228 { 229 case 0: 230 pRet = &aIter->second.aFeatures; 231 break; 232 case 1: 233 pRet = &aIter->second.aProperties; 234 break; 235 case 2: 236 pRet = &aIter->second.aMetaData; 237 break; 238 } 239 sOldPattern = aIter->first; 240 } 241 } // for(;aIter != aEnd;++aIter) 242 if ( pRet == NULL ) 243 { 244 static const ::comphelper::NamedValueCollection s_sEmpty; 245 pRet = &s_sEmpty; 246 } 247 return *pRet; 248 } 249 // ----------------------------------------------------------------------------- 250 uno::Sequence< ::rtl::OUString > DriversConfig::getURLs() const 251 { 252 const TInstalledDrivers& rDrivers = m_aNode->getInstalledDrivers(m_xORB); 253 uno::Sequence< ::rtl::OUString > aRet(rDrivers.size()); 254 ::rtl::OUString* pIter = aRet.getArray(); 255 TInstalledDrivers::const_iterator aIter = rDrivers.begin(); 256 TInstalledDrivers::const_iterator aEnd = rDrivers.end(); 257 for(;aIter != aEnd;++aIter,++pIter) 258 { 259 *pIter = aIter->first; 260 } 261 return aRet; 262 } 263