diff options
Diffstat (limited to 'i18npool/source/inputchecker/inputsequencechecker.cxx')
-rw-r--r-- | i18npool/source/inputchecker/inputsequencechecker.cxx | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/i18npool/source/inputchecker/inputsequencechecker.cxx b/i18npool/source/inputchecker/inputsequencechecker.cxx new file mode 100644 index 000000000000..9b71a27f7acd --- /dev/null +++ b/i18npool/source/inputchecker/inputsequencechecker.cxx @@ -0,0 +1,169 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: inputsequencechecker.cxx,v $ + * $Revision: 1.10 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_i18npool.hxx" + +#include <inputsequencechecker.hxx> +#include <com/sun/star/i18n/InputSequenceCheckMode.hpp> +#include <com/sun/star/i18n/UnicodeType.hpp> +#include <i18nutil/unicode.hxx> +#include <rtl/ustrbuf.hxx> + +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; +} + +} } } } |