156 lines
4.3 KiB
C++
156 lines
4.3 KiB
C++
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
|
|
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
|
|
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
|
|
// PARTICULAR PURPOSE.
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved
|
|
|
|
// SampleSpellCheckProvider.cpp : Implementation of the sample provider
|
|
|
|
#include "SampleSpellCheckProvider.h"
|
|
#include "util.h"
|
|
#include "EnumString.h"
|
|
#include "strsafe.h"
|
|
#include "engineoptions.h"
|
|
#include "OptionDescription.h"
|
|
#include "EnumSpellingError.h"
|
|
|
|
const PCWSTR spellerId = L"samplespell";
|
|
const PCWSTR localizedName = L"Sample Spell Checker";
|
|
|
|
IFACEMETHODIMP CSampleSpellCheckProvider::get_LanguageTag(_Out_ PWSTR* value)
|
|
{
|
|
return CoTaskStringAlloc(_languageTag, value);
|
|
};
|
|
|
|
IFACEMETHODIMP CSampleSpellCheckProvider::get_Id(_Out_ PWSTR* value)
|
|
{
|
|
return CoTaskStringAlloc(spellerId, value);
|
|
}
|
|
|
|
IFACEMETHODIMP CSampleSpellCheckProvider::get_LocalizedName(_Out_ PWSTR* value)
|
|
{
|
|
return CoTaskStringAlloc(localizedName, value);
|
|
}
|
|
|
|
IFACEMETHODIMP CSampleSpellCheckProvider::get_OptionIds(_COM_Outptr_ IEnumString** value)
|
|
{
|
|
*value = nullptr;
|
|
PCWSTR optionIds[OptionsStore::MAX_LANGUAGE_OPTIONS];
|
|
size_t numIds;
|
|
HRESULT hr = OptionsStore::GetOptionIdsForLanguage(_languageTag, &numIds, optionIds);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = CreateEnumString(optionIds, optionIds + numIds, value);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
IFACEMETHODIMP CSampleSpellCheckProvider::Check(_In_ PCWSTR text, _COM_Outptr_ IEnumSpellingError** value)
|
|
{
|
|
*value = nullptr;
|
|
CEnumSpellingError* enumSpellingError = nullptr;
|
|
HRESULT hr = CEnumSpellingError::CreateInstance(text, this, &enumSpellingError);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
*value = enumSpellingError;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
IFACEMETHODIMP CSampleSpellCheckProvider::Suggest(_In_ PCWSTR word, _COM_Outptr_ IEnumString** value)
|
|
{
|
|
*value = nullptr;
|
|
wchar_t suggestions[5][SampleEngine::MAX_WORD_SIZE];
|
|
size_t numSuggestions;
|
|
HRESULT hr = engine.GetSuggestions(word, ARRAYSIZE(suggestions), &numSuggestions, suggestions);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
PCWSTR suggestionList[] = {suggestions[0], suggestions[1], suggestions[2], suggestions[3], suggestions[4]};
|
|
hr = CreateEnumString(suggestionList, suggestionList + numSuggestions, value);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
IFACEMETHODIMP CSampleSpellCheckProvider::GetOptionValue(_In_ PCWSTR optionId, _Out_ BYTE* value)
|
|
{
|
|
return engine.GetOptionValue(optionId, value);
|
|
}
|
|
|
|
IFACEMETHODIMP CSampleSpellCheckProvider::SetOptionValue(_In_ PCWSTR optionId, BYTE value)
|
|
{
|
|
return engine.SetOptionValue(optionId, value);
|
|
}
|
|
|
|
IFACEMETHODIMP CSampleSpellCheckProvider::InitializeWordlist(WORDLIST_TYPE wordlistType, _In_ IEnumString* words)
|
|
{
|
|
unsigned int type = wordlistType;
|
|
engine.ClearWordlist(type);
|
|
|
|
HRESULT hr = S_OK;
|
|
while (S_OK == hr)
|
|
{
|
|
LPOLESTR lpWord;
|
|
hr = words->Next(1, &lpWord, nullptr);
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = engine.AddWordToWordlist(type, lpWord);
|
|
CoTaskMemFree(lpWord);
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
IFACEMETHODIMP CSampleSpellCheckProvider::GetOptionDescription(_In_ PCWSTR optionId, _COM_Outptr_ IOptionDescription** value)
|
|
{
|
|
*value = nullptr;
|
|
COptionDescription* optionDescription;
|
|
HRESULT hr = COptionDescription::CreateInstance(optionId, &optionDescription);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
*value = optionDescription;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CSampleSpellCheckProvider::CreateInstance(_In_ PCWSTR languageTag, _COM_Outptr_ CSampleSpellCheckProvider** spellProvider)
|
|
{
|
|
HRESULT hr = AtlHelper::CreateInstance(spellProvider);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = (*spellProvider)->Init(languageTag);
|
|
if (FAILED(hr))
|
|
{
|
|
(*spellProvider)->Release();
|
|
*spellProvider = nullptr;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
*spellProvider = nullptr;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CSampleSpellCheckProvider::Init(_In_ PCWSTR languageTag)
|
|
{
|
|
engine = SampleEngine(languageTag);
|
|
return StringCchCopy(_languageTag, ARRAYSIZE(_languageTag), languageTag);
|
|
}
|
|
|
|
HRESULT CSampleSpellCheckProvider::EngineCheck(_In_ PCWSTR text, _Out_ SampleEngine::SpellingError* spellingError)
|
|
{
|
|
return engine.FindFirstError(text, spellingError);
|
|
}
|