2025-11-28 00:35:46 +09:00

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);
}