1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_i18npool.hxx" 26 #include <rtl/ustrbuf.hxx> 27 #include <indexentrysupplier.hxx> 28 #include <localedata.hxx> 29 30 using namespace ::com::sun::star::uno; 31 using namespace ::com::sun::star::lang; 32 using namespace ::rtl; 33 34 static const sal_Unicode under = sal_Unicode('_'); 35 36 namespace com { namespace sun { namespace star { namespace i18n { 37 38 IndexEntrySupplier::IndexEntrySupplier( const Reference < XMultiServiceFactory >& rxMSF ) : xMSF( rxMSF ) 39 { 40 } 41 42 Sequence < Locale > SAL_CALL IndexEntrySupplier::getLocaleList() 43 { 44 return LocaleData().getAllInstalledLocaleNames(); 45 } 46 47 Sequence < OUString > SAL_CALL IndexEntrySupplier::getAlgorithmList( const Locale& rLocale ) 48 { 49 return LocaleData().getIndexAlgorithm(rLocale); 50 } 51 52 sal_Bool SAL_CALL IndexEntrySupplier::loadAlgorithm( const Locale& rLocale, const OUString& SortAlgorithm, 53 sal_Int32 collatorOptions ) 54 { 55 Sequence < OUString > algorithmList = getAlgorithmList( rLocale ); 56 for (sal_Int32 i = 0; i < algorithmList.getLength(); i++) { 57 if (algorithmList[i] == SortAlgorithm) { 58 if (getLocaleSpecificIndexEntrySupplier(rLocale, SortAlgorithm).is()) 59 return xIES->loadAlgorithm(rLocale, SortAlgorithm, collatorOptions); 60 } 61 } 62 return sal_False; 63 } 64 65 sal_Bool SAL_CALL IndexEntrySupplier::usePhoneticEntry( const Locale& rLocale ) 66 { 67 return LocaleData().hasPhonetic(rLocale); 68 } 69 70 OUString SAL_CALL IndexEntrySupplier::getPhoneticCandidate( const OUString& rIndexEntry, 71 const Locale& rLocale ) 72 { 73 if (getLocaleSpecificIndexEntrySupplier(rLocale, OUString()).is()) 74 return xIES->getPhoneticCandidate(rIndexEntry, rLocale); 75 else 76 throw RuntimeException(); 77 } 78 79 OUString SAL_CALL IndexEntrySupplier::getIndexKey( const OUString& rIndexEntry, 80 const OUString& rPhoneticEntry, const Locale& rLocale ) 81 { 82 if (xIES.is()) 83 return xIES->getIndexKey(rIndexEntry, rPhoneticEntry, rLocale); 84 else 85 throw RuntimeException(); 86 } 87 88 sal_Int16 SAL_CALL IndexEntrySupplier::compareIndexEntry( 89 const OUString& rIndexEntry1, const OUString& rPhoneticEntry1, const Locale& rLocale1, 90 const OUString& rIndexEntry2, const OUString& rPhoneticEntry2, const Locale& rLocale2 ) 91 { 92 if (xIES.is()) 93 return xIES->compareIndexEntry(rIndexEntry1, rPhoneticEntry1, rLocale1, 94 rIndexEntry2, rPhoneticEntry2, rLocale2); 95 else 96 throw RuntimeException(); 97 } 98 99 OUString SAL_CALL IndexEntrySupplier::getIndexCharacter( const OUString& rIndexEntry, 100 const Locale& rLocale, const OUString& rSortAlgorithm ) 101 { 102 return getLocaleSpecificIndexEntrySupplier(rLocale, rSortAlgorithm)-> 103 getIndexCharacter( rIndexEntry, rLocale, rSortAlgorithm ); 104 } 105 106 sal_Bool SAL_CALL IndexEntrySupplier::createLocaleSpecificIndexEntrySupplier(const OUString& name) 107 { 108 Reference < XInterface > xI = xMSF->createInstance( 109 OUString::createFromAscii("com.sun.star.i18n.IndexEntrySupplier_") + name); 110 111 if ( xI.is() ) { 112 xI->queryInterface( ::getCppuType((const Reference< com::sun::star::i18n::XExtendedIndexEntrySupplier>*)0) ) >>= xIES; 113 return xIES.is(); 114 } 115 return sal_False; 116 } 117 118 Reference < com::sun::star::i18n::XExtendedIndexEntrySupplier > SAL_CALL 119 IndexEntrySupplier::getLocaleSpecificIndexEntrySupplier(const Locale& rLocale, const OUString& rSortAlgorithm) 120 { 121 if (xIES.is() && rSortAlgorithm == aSortAlgorithm && rLocale.Language == aLocale.Language && 122 rLocale.Country == aLocale.Country && rLocale.Variant == aLocale.Variant) 123 return xIES; 124 else if (xMSF.is()) { 125 LocaleData ld; 126 aLocale = rLocale; 127 if (rSortAlgorithm.getLength() == 0) 128 aSortAlgorithm = ld.getDefaultIndexAlgorithm( rLocale ); 129 else 130 aSortAlgorithm = rSortAlgorithm; 131 132 OUString module = ld.getIndexModuleByAlgorithm(rLocale, aSortAlgorithm); 133 if (module.getLength() > 0 && createLocaleSpecificIndexEntrySupplier(module)) 134 return xIES; 135 136 sal_Int32 l = rLocale.Language.getLength(); 137 sal_Int32 c = rLocale.Country.getLength(); 138 sal_Int32 v = rLocale.Variant.getLength(); 139 sal_Int32 a = aSortAlgorithm.getLength(); 140 OUStringBuffer aBuf(l+c+v+a+4); 141 142 if ((l > 0 && c > 0 && v > 0 && a > 0 && 143 // load service with name <base>_<lang>_<country>_<varian>_<algorithm> 144 createLocaleSpecificIndexEntrySupplier(aBuf.append(rLocale.Language).append(under).append( 145 rLocale.Country).append(under).append(rLocale.Variant).append(under).append( 146 aSortAlgorithm).makeStringAndClear())) || 147 (l > 0 && c > 0 && a > 0 && 148 // load service with name <base>_<lang>_<country>_<algorithm> 149 createLocaleSpecificIndexEntrySupplier(aBuf.append(rLocale.Language).append(under).append( 150 rLocale.Country).append(under).append(aSortAlgorithm).makeStringAndClear())) || 151 (l > 0 && c > 0 && a > 0 && rLocale.Language.compareToAscii("zh") == 0 && 152 (rLocale.Country.compareToAscii("HK") == 0 || 153 rLocale.Country.compareToAscii("MO") == 0) && 154 // if the country code is HK or MO, one more step to try TW. 155 createLocaleSpecificIndexEntrySupplier(aBuf.append(rLocale.Language).append(under).appendAscii( 156 "TW").append(under).append(aSortAlgorithm).makeStringAndClear())) || 157 (l > 0 && a > 0 && 158 // load service with name <base>_<lang>_<algorithm> 159 createLocaleSpecificIndexEntrySupplier(aBuf.append(rLocale.Language).append(under).append( 160 aSortAlgorithm).makeStringAndClear())) || 161 // load service with name <base>_<algorithm> 162 (a > 0 && createLocaleSpecificIndexEntrySupplier(aSortAlgorithm)) || 163 // load default service with name <base>_Unicode 164 createLocaleSpecificIndexEntrySupplier(OUString::createFromAscii("Unicode"))) { 165 return xIES; 166 } 167 } 168 throw RuntimeException(); 169 } 170 171 OUString SAL_CALL IndexEntrySupplier::getIndexFollowPageWord( sal_Bool bMorePages, 172 const Locale& rLocale ) 173 { 174 Sequence< OUString > aFollowPageWords = LocaleData().getFollowPageWords(rLocale); 175 176 return (bMorePages && aFollowPageWords.getLength() > 1) ? 177 aFollowPageWords[1] : (aFollowPageWords.getLength() > 0 ? 178 aFollowPageWords[0] : OUString()); 179 } 180 181 #define implementationName "com.sun.star.i18n.IndexEntrySupplier" 182 183 OUString SAL_CALL 184 IndexEntrySupplier::getImplementationName() 185 { 186 return OUString::createFromAscii( implementationName ); 187 } 188 189 sal_Bool SAL_CALL 190 IndexEntrySupplier::supportsService(const OUString& rServiceName) 191 { 192 return rServiceName.compareToAscii(implementationName) == 0; 193 } 194 195 Sequence< OUString > SAL_CALL 196 IndexEntrySupplier::getSupportedServiceNames() 197 { 198 Sequence< OUString > aRet(1); 199 aRet[0] = OUString::createFromAscii( implementationName ); 200 return aRet; 201 } 202 203 } } } } 204