File indexing completed on 2024-05-19 11:48:46
0001 /* 0002 SPDX-FileCopyrightText: 2019 Christoph Cullmann <cullmann@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "ispellcheckerclient.h" 0008 #include "ispellcheckerdebug.h" 0009 #include "ispellcheckerdict.h" 0010 0011 using namespace Sonnet; 0012 0013 ISpellCheckerClient::ISpellCheckerClient(QObject *parent) 0014 : Client(parent) 0015 { 0016 qCDebug(SONNET_ISPELLCHECKER) << " ISpellCheckerClient::ISpellCheckerClient"; 0017 0018 // init com if needed, use same variant as e.g. Qt in qtbase/src/corelib/io/qfilesystemengine_win.cpp 0019 CoInitialize(nullptr); 0020 0021 // get factory & collect all known languages + instantiate the spell checkers for them 0022 ISpellCheckerFactory *spellCheckerFactory = nullptr; 0023 if (SUCCEEDED(CoCreateInstance(__uuidof(SpellCheckerFactory), nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&spellCheckerFactory))) && spellCheckerFactory) { 0024 // if we have a factory, cache the language names 0025 IEnumString *enumLanguages = nullptr; 0026 if (SUCCEEDED(spellCheckerFactory->get_SupportedLanguages(&enumLanguages))) { 0027 HRESULT hr = S_OK; 0028 while (S_OK == hr) { 0029 LPOLESTR string = nullptr; 0030 hr = enumLanguages->Next(1, &string, nullptr); 0031 if (S_OK == hr) { 0032 ISpellChecker *spellChecker = nullptr; 0033 if (SUCCEEDED(spellCheckerFactory->CreateSpellChecker(string, &spellChecker)) && spellChecker) { 0034 m_languages.insert(QString::fromWCharArray(string), spellChecker); 0035 } 0036 CoTaskMemFree(string); 0037 } 0038 } 0039 enumLanguages->Release(); 0040 } 0041 spellCheckerFactory->Release(); 0042 } 0043 } 0044 0045 ISpellCheckerClient::~ISpellCheckerClient() 0046 { 0047 // FIXME: we at the moment leak all checkers as sonnet does the cleanup to late for proper com cleanup :/ 0048 } 0049 0050 SpellerPlugin *ISpellCheckerClient::createSpeller(const QString &language) 0051 { 0052 // create requested spellchecker if we know the language 0053 qCDebug(SONNET_ISPELLCHECKER) << " SpellerPlugin *ISpellCheckerClient::createSpeller(const QString &language) ;" << language; 0054 const auto it = m_languages.find(language); 0055 if (it != m_languages.end()) { 0056 return new ISpellCheckerDict(it.value(), language); 0057 } 0058 return nullptr; 0059 } 0060 0061 QStringList ISpellCheckerClient::languages() const 0062 { 0063 return m_languages.keys(); 0064 } 0065 0066 #include "moc_ispellcheckerclient.cpp"