File indexing completed on 2024-05-05 04:01:24

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"