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

129 lines
2.6 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
#include "private.h"
#include "TipCandidateString.h"
HRESULT CTipCandidateString::CreateInstance(_Outptr_ CTipCandidateString **ppobj)
{
if (ppobj == nullptr)
{
return E_INVALIDARG;
}
*ppobj = nullptr;
*ppobj = new (std::nothrow) CTipCandidateString();
if (*ppobj == nullptr)
{
return E_OUTOFMEMORY;
}
return S_OK;
}
HRESULT CTipCandidateString::CreateInstance(REFIID riid, _Outptr_ void **ppvObj)
{
if (ppvObj == nullptr)
{
return E_INVALIDARG;
}
*ppvObj = nullptr;
*ppvObj = new (std::nothrow) CTipCandidateString();
if (*ppvObj == nullptr)
{
return E_OUTOFMEMORY;
}
return ((CTipCandidateString*)(*ppvObj))->QueryInterface(riid, ppvObj);
}
CTipCandidateString::CTipCandidateString(void)
{
_refCount = 0;
_index = 0;
}
CTipCandidateString::~CTipCandidateString()
{
}
// IUnknown methods
STDMETHODIMP CTipCandidateString::QueryInterface(REFIID riid, _Outptr_ void **ppvObj)
{
if (ppvObj == nullptr)
{
return E_POINTER;
}
*ppvObj = nullptr;
if (IsEqualIID(riid, IID_IUnknown))
{
*ppvObj = (CTipCandidateString*)this;
}
else if (IsEqualIID(riid, IID_ITfCandidateString))
{
*ppvObj = (CTipCandidateString*)this;
}
if (*ppvObj == nullptr)
{
return E_NOINTERFACE;
}
AddRef();
return S_OK;
}
STDMETHODIMP_(ULONG) CTipCandidateString::AddRef(void)
{
return (ULONG)InterlockedIncrement((LONG*)&_refCount);
}
STDMETHODIMP_(ULONG) CTipCandidateString::Release(void)
{
ULONG refT = (ULONG)InterlockedDecrement((LONG*)&_refCount);
if (0 < refT)
{
return refT;
}
delete this;
return 0;
}
// ITfCandidateString methods
STDMETHODIMP CTipCandidateString::GetString(BSTR *pbstr)
{
*pbstr = SysAllocString(_candidateStr.c_str());
return S_OK;
}
STDMETHODIMP CTipCandidateString::GetIndex(_Out_ ULONG *pnIndex)
{
if (pnIndex == nullptr)
{
return E_POINTER;
}
*pnIndex = _index;
return S_OK;
}
STDMETHODIMP CTipCandidateString::SetIndex(ULONG uIndex)
{
_index = uIndex;
return S_OK;
}
STDMETHODIMP CTipCandidateString::SetString(_In_ const WCHAR *pch, DWORD_PTR length)
{
_candidateStr.assign(pch, 0, length);
return S_OK;
}