IFACEMETHODIMP CTriColorControlProvider::GetSelection(_Outptr_result_maybenull_ SAFEARRAY * *retVal) 
{ 
    *retVal = nullptr;
    HRESULT hr = CheckDisconnected();
    if (SUCCEEDED(hr))
    {
        TriColorValue controlValue;
        hr = m_control->get_ControlValue(&controlValue);
        if (SUCCEEDED(hr))
        {
            ComPtr<IInspectable> spFragmentProvider;
            hr = m_control->GetTriColorFragmentProvider(controlValue, &spFragmentProvider);
            if (SUCCEEDED(hr))
            {
                *retVal = SafeArrayCreateVector(VT_UNKNOWN, 0, 1);
                if (*retVal != nullptr)
                {
                    long index = 0;
                    hr = SafeArrayPutElement(*retVal, &index, spFragmentProvider.Get());
                    if (FAILED(hr))
                    {
                        SafeArrayDestroy(*retVal);
                        *retVal = nullptr;
                    }
                }
                else
                {
                    hr = E_OUTOFMEMORY;
                }
            }
        }
    }

    return hr; 
}
STDMETHODIMP CTriColorFragmentProvider::get_IsSelected(_Out_ BOOL *retVal)
{
    *retVal = FALSE;
    HRESULT hr = CheckDisconnected();
    if (SUCCEEDED(hr))
    {
        // Is this fragment already selected?
        TriColorValue controlValue;
        hr = m_control->get_ControlValue(&controlValue);
        if (SUCCEEDED(hr))
        {
            *retVal = (controlValue == m_value);
        }
    }
    return hr;
}
IFACEMETHODIMP CTriColorControlProvider::get_Value(_Out_ BSTR *retVal) 
{ 
    *retVal = nullptr;
    HRESULT hr = CheckDisconnected();
    if (SUCCEEDED(hr))
    {
        TriColorValue controlValue;
        hr = m_control->get_ControlValue(&controlValue);
        if (SUCCEEDED(hr))
        {
            hr = TriColorValueHelper::ValueToString(controlValue, retVal);
        }
    }

    return hr;
}
STDMETHODIMP CTriColorFragmentProvider::RemoveFromSelection()
{ 
    HRESULT hr = CheckDisconnected();
    if (SUCCEEDED(hr))
    {
        // Is this fragment already selected?
        TriColorValue controlValue;
        hr = m_control->get_ControlValue(&controlValue);
        if (SUCCEEDED(hr))
        {
            if (controlValue == m_value)
            {
                // Cannot do multiple selection
                hr = UIA_E_INVALIDOPERATION;
            }
            else
            {
                // It's already unselected - operation succeeded.
                hr = S_OK;
            }
        }
    }
    return hr;
}