Changeset View
Changeset View
Standalone View
Standalone View
src/plugins/ispellchecker/ispellcheckerclient.cpp
Show All 9 Lines | |||||
10 | 10 | | |||
11 | using namespace Sonnet; | 11 | using namespace Sonnet; | ||
12 | 12 | | |||
13 | ISpellCheckerClient::ISpellCheckerClient(QObject *parent) | 13 | ISpellCheckerClient::ISpellCheckerClient(QObject *parent) | ||
14 | : Client(parent) | 14 | : Client(parent) | ||
15 | { | 15 | { | ||
16 | qCDebug(SONNET_ISPELLCHECKER) << " ISpellCheckerClient::ISpellCheckerClient"; | 16 | qCDebug(SONNET_ISPELLCHECKER) << " ISpellCheckerClient::ISpellCheckerClient"; | ||
17 | 17 | | |||
18 | // init com if needed | 18 | // init com if needed, use same variant as e.g. Qt in qtbase/src/corelib/io/qfilesystemengine_win.cpp | ||
19 | m_wasCOMInitialized = SUCCEEDED(CoInitializeEx(nullptr, COINIT_MULTITHREADED)); | 19 | CoInitialize(nullptr); | ||
20 | 20 | | |||
21 | // get factory | 21 | // get factory & collect all known languages + instantiate the spell checkers for them | ||
22 | if (SUCCEEDED(CoCreateInstance(__uuidof(SpellCheckerFactory), nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&m_spellCheckerFactory)))) { | 22 | ISpellCheckerFactory *spellCheckerFactory = nullptr; | ||
23 | if (SUCCEEDED(CoCreateInstance(__uuidof(SpellCheckerFactory), nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&spellCheckerFactory))) && spellCheckerFactory) { | ||||
23 | // if we have a factory, cache the language names | 24 | // if we have a factory, cache the language names | ||
24 | IEnumString* enumLanguages = nullptr; | 25 | IEnumString* enumLanguages = nullptr; | ||
25 | if (SUCCEEDED(m_spellCheckerFactory->get_SupportedLanguages(&enumLanguages))) { | 26 | if (SUCCEEDED(spellCheckerFactory->get_SupportedLanguages(&enumLanguages))) { | ||
26 | HRESULT hr = S_OK; | 27 | HRESULT hr = S_OK; | ||
27 | while (S_OK == hr) { | 28 | while (S_OK == hr) { | ||
28 | LPOLESTR string = nullptr; | 29 | LPOLESTR string = nullptr; | ||
29 | hr = enumLanguages->Next(1, &string, nullptr); | 30 | hr = enumLanguages->Next(1, &string, nullptr); | ||
30 | if (S_OK == hr) { | 31 | if (S_OK == hr) { | ||
31 | m_languages.push_back(QString::fromWCharArray(string)); | 32 | ISpellChecker *spellChecker = nullptr; | ||
33 | if (SUCCEEDED(spellCheckerFactory->CreateSpellChecker(string, &spellChecker)) && spellChecker) { | ||||
34 | m_languages.insert(QString::fromWCharArray(string), spellChecker); | ||||
35 | } | ||||
32 | CoTaskMemFree(string); | 36 | CoTaskMemFree(string); | ||
33 | } | 37 | } | ||
34 | } | 38 | } | ||
35 | enumLanguages->Release(); | 39 | enumLanguages->Release(); | ||
36 | } | 40 | } | ||
37 | } else { | 41 | spellCheckerFactory->Release(); | ||
38 | m_spellCheckerFactory = nullptr; | | |||
39 | } | 42 | } | ||
40 | } | 43 | } | ||
41 | 44 | | |||
42 | ISpellCheckerClient::~ISpellCheckerClient() | 45 | ISpellCheckerClient::~ISpellCheckerClient() | ||
43 | { | 46 | { | ||
44 | // de-init com if needed | 47 | // FIXME: we at the moment leak all checkers as sonnet does the cleanup to late for proper com cleanup :/ | ||
45 | if (m_wasCOMInitialized) { | | |||
46 | CoUninitialize(); | | |||
47 | } | | |||
48 | | ||||
49 | // release factory | | |||
50 | if (m_spellCheckerFactory) { | | |||
51 | m_spellCheckerFactory->Release(); | | |||
52 | } | | |||
53 | } | 48 | } | ||
54 | 49 | | |||
55 | SpellerPlugin *ISpellCheckerClient::createSpeller(const QString &language) | 50 | SpellerPlugin *ISpellCheckerClient::createSpeller(const QString &language) | ||
56 | { | 51 | { | ||
57 | // create requested spellchecker, might internally fail to create instance | 52 | // create requested spellchecker if we know the language | ||
58 | qCDebug(SONNET_ISPELLCHECKER) << " SpellerPlugin *ISpellCheckerClient::createSpeller(const QString &language) ;" << language; | 53 | qCDebug(SONNET_ISPELLCHECKER) << " SpellerPlugin *ISpellCheckerClient::createSpeller(const QString &language) ;" << language; | ||
59 | ISpellCheckerDict *ad = new ISpellCheckerDict(m_spellCheckerFactory, language); | 54 | const auto it = m_languages.find(language); | ||
60 | return ad; | 55 | if (it != m_languages.end()) { | ||
56 | return new ISpellCheckerDict(it.value(), language); | ||||
57 | } | ||||
58 | return nullptr; | ||||
61 | } | 59 | } | ||
62 | 60 | | |||
63 | QStringList ISpellCheckerClient::languages() const | 61 | QStringList ISpellCheckerClient::languages() const | ||
64 | { | 62 | { | ||
65 | return m_languages; | 63 | return m_languages.keys(); | ||
66 | } | 64 | } |