root/win8/metro_driver/ime/input_scope.cc

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. InputScopeImpl
  2. BEGIN_COM_MAP
  3. STDMETHOD
  4. STDMETHOD
  5. STDMETHOD
  6. STDMETHOD
  7. STDMETHOD
  8. CreteInputScope

// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "win8/metro_driver/ime/input_scope.h"

#include <atlbase.h>
#include <atlcom.h>

#include "base/logging.h"
#include "ui/base/win/atl_module.h"

namespace metro_driver {
namespace {

// An implementation of ITfInputScope interface.
// This implementation only covers ITfInputScope::GetInputScopes since built-in
// on-screen keyboard on Windows 8+ changes its layout depending on the returned
// value of this method.
// Although other advanced features of ITfInputScope such as phase list or
// regex support might be useful for IMEs or on-screen keyboards in future,
// no IME seems to be utilizing such features as of Windows 8.1.
class ATL_NO_VTABLE InputScopeImpl
    : public CComObjectRootEx<CComMultiThreadModel>,
      public ITfInputScope {
 public:
  InputScopeImpl() {}

  BEGIN_COM_MAP(InputScopeImpl)
    COM_INTERFACE_ENTRY(ITfInputScope)
  END_COM_MAP()

  void Initialize(const std::vector<InputScope>& input_scopes) {
    input_scopes_ = input_scopes;
  }

 private:
  // ITfInputScope overrides:
  STDMETHOD(GetInputScopes)(InputScope** input_scopes, UINT* count) OVERRIDE {
    if (!count || !input_scopes)
      return E_INVALIDARG;
    *input_scopes = static_cast<InputScope*>(
        CoTaskMemAlloc(sizeof(InputScope) * input_scopes_.size()));
    if (!input_scopes) {
      *count = 0;
      return E_OUTOFMEMORY;
    }
    std::copy(input_scopes_.begin(), input_scopes_.end(), *input_scopes);
    *count = static_cast<UINT>(input_scopes_.size());
    return S_OK;
  }
  STDMETHOD(GetPhrase)(BSTR** phrases, UINT* count) OVERRIDE {
    return E_NOTIMPL;
  }
  STDMETHOD(GetRegularExpression)(BSTR* regexp) OVERRIDE {
    return E_NOTIMPL;
  }
  STDMETHOD(GetSRGS)(BSTR* srgs) OVERRIDE {
    return E_NOTIMPL;
  }
  STDMETHOD(GetXML)(BSTR* xml) OVERRIDE {
    return E_NOTIMPL;
  }

  // Data which ITfInputScope::GetInputScopes should return.
  std::vector<InputScope> input_scopes_;

  DISALLOW_COPY_AND_ASSIGN(InputScopeImpl);
};

}  // namespace

base::win::ScopedComPtr<ITfInputScope>
CreteInputScope(const std::vector<InputScope>& input_scopes) {
  ui::win::CreateATLModuleIfNeeded();
  CComObject<InputScopeImpl>* object = NULL;
  HRESULT hr = CComObject<InputScopeImpl>::CreateInstance(&object);
  if (FAILED(hr)) {
    LOG(ERROR) << "CComObject<InputScopeImpl>::CreateInstance failed. hr = "
               << hr;
    return base::win::ScopedComPtr<ITfInputScope>();
  }
  object->Initialize(input_scopes);
  return base::win::ScopedComPtr<ITfInputScope>(object);
}

}  // namespace metro_driver

/* [<][>][^][v][top][bottom][index][help] */