/************************************************************** * * 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_i18npool.hxx" #include #include #include #include #include using namespace ::com::sun::star::uno; using namespace ::com::sun::star::lang; using namespace ::rtl; namespace com { namespace sun { namespace star { namespace i18n { InputSequenceCheckerImpl::InputSequenceCheckerImpl( const Reference < XMultiServiceFactory >& rxMSF ) : xMSF( rxMSF ) { serviceName = "com.sun.star.i18n.InputSequenceCheckerImpl"; cachedItem = NULL; } InputSequenceCheckerImpl::InputSequenceCheckerImpl() { } InputSequenceCheckerImpl::~InputSequenceCheckerImpl() { // Clear lookuptable for (size_t l = 0; l < lookupTable.size(); l++) delete lookupTable[l]; lookupTable.clear(); } sal_Bool SAL_CALL InputSequenceCheckerImpl::checkInputSequence(const OUString& Text, sal_Int32 nStartPos, sal_Unicode inputChar, sal_Int16 inputCheckMode) throw(RuntimeException) { if (inputCheckMode == InputSequenceCheckMode::PASSTHROUGH) return sal_True; sal_Char* language = getLanguageByScripType(Text[nStartPos], inputChar); if (language) return getInputSequenceChecker(language)->checkInputSequence(Text, nStartPos, inputChar, inputCheckMode); else return sal_True; // not a checkable languages. } sal_Int32 SAL_CALL InputSequenceCheckerImpl::correctInputSequence(OUString& Text, sal_Int32 nStartPos, sal_Unicode inputChar, sal_Int16 inputCheckMode) throw(RuntimeException) { if (inputCheckMode != InputSequenceCheckMode::PASSTHROUGH) { sal_Char* language = getLanguageByScripType(Text[nStartPos], inputChar); if (language) return getInputSequenceChecker(language)->correctInputSequence(Text, nStartPos, inputChar, inputCheckMode); } Text = Text.replaceAt(++nStartPos, 0, OUString(inputChar)); return nStartPos; } static ScriptTypeList typeList[] = { //{ UnicodeScript_kHebrew, UnicodeScript_kHebrew }, // 10, //{ UnicodeScript_kArabic, UnicodeScript_kArabic }, // 11, { UnicodeScript_kDevanagari,UnicodeScript_kDevanagari, UnicodeScript_kDevanagari }, // 14, { UnicodeScript_kThai, UnicodeScript_kThai, UnicodeScript_kThai }, // 24, { UnicodeScript_kScriptCount, UnicodeScript_kScriptCount, UnicodeScript_kScriptCount } // 88 }; sal_Char* SAL_CALL InputSequenceCheckerImpl::getLanguageByScripType(sal_Unicode cChar, sal_Unicode nChar) { sal_Int16 type = unicode::getUnicodeScriptType( cChar, typeList, UnicodeScript_kScriptCount ); if (type != UnicodeScript_kScriptCount && type == unicode::getUnicodeScriptType( nChar, typeList, UnicodeScript_kScriptCount )) { switch(type) { case UnicodeScript_kThai: return (sal_Char*)"th"; //case UnicodeScript_kArabic: return (sal_Char*)"ar"; //case UnicodeScript_kHebrew: return (sal_Char*)"he"; case UnicodeScript_kDevanagari: return (sal_Char*)"hi"; } } return NULL; } Reference< XExtendedInputSequenceChecker >& SAL_CALL InputSequenceCheckerImpl::getInputSequenceChecker(sal_Char* rLanguage) throw (RuntimeException) { if (cachedItem && cachedItem->aLanguage == rLanguage) { return cachedItem->xISC; } else if (xMSF.is()) { for (size_t l = 0; l < lookupTable.size(); l++) { cachedItem = lookupTable[l]; if (cachedItem->aLanguage == rLanguage) return cachedItem->xISC; } Reference < uno::XInterface > xI = xMSF->createInstance( OUString::createFromAscii("com.sun.star.i18n.InputSequenceChecker_") + OUString::createFromAscii(rLanguage)); if ( xI.is() ) { Reference< XExtendedInputSequenceChecker > xISC; xI->queryInterface( getCppuType((const Reference< XExtendedInputSequenceChecker>*)0) ) >>= xISC; if (xISC.is()) { lookupTable.push_back(cachedItem = new lookupTableItem(rLanguage, xISC)); return cachedItem->xISC; } } } throw RuntimeException(); } OUString SAL_CALL InputSequenceCheckerImpl::getImplementationName(void) throw( RuntimeException ) { return OUString::createFromAscii(serviceName); } sal_Bool SAL_CALL InputSequenceCheckerImpl::supportsService(const OUString& rServiceName) throw( RuntimeException ) { return !rServiceName.compareToAscii(serviceName); } Sequence< OUString > SAL_CALL InputSequenceCheckerImpl::getSupportedServiceNames(void) throw( RuntimeException ) { Sequence< OUString > aRet(1); aRet[0] = OUString::createFromAscii(serviceName); return aRet; } } } } }