Index: win8/metro_driver/ime/input_source.cc |
diff --git a/win8/metro_driver/ime/input_source.cc b/win8/metro_driver/ime/input_source.cc |
deleted file mode 100644 |
index 079ddb04a09663491ab3b34a57c5863ee758757c..0000000000000000000000000000000000000000 |
--- a/win8/metro_driver/ime/input_source.cc |
+++ /dev/null |
@@ -1,172 +0,0 @@ |
-// 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_source.h" |
- |
-#include <atlbase.h> |
-#include <atlcom.h> |
-#include <msctf.h> |
- |
-#include "base/bind.h" |
-#include "base/callback.h" |
-#include "base/logging.h" |
-#include "base/macros.h" |
-#include "base/memory/ref_counted.h" |
-#include "base/observer_list.h" |
-#include "base/win/scoped_comptr.h" |
-#include "ui/base/win/atl_module.h" |
-#include "win8/metro_driver/ime/input_source_observer.h" |
- |
-namespace metro_driver { |
-namespace { |
- |
-// An implementation of ITfLanguageProfileNotifySink interface, which will be |
-// used to receive notifications when the text input source is changed. |
-class ATL_NO_VTABLE InputSourceMonitor |
- : public CComObjectRootEx<CComMultiThreadModel>, |
- public ITfLanguageProfileNotifySink { |
- public: |
- InputSourceMonitor() |
- : cookie_(TF_INVALID_COOKIE) { |
- } |
- |
- BEGIN_COM_MAP(InputSourceMonitor) |
- COM_INTERFACE_ENTRY(ITfLanguageProfileNotifySink) |
- END_COM_MAP() |
- |
- bool Initialize(ITfSource* source) { |
- DWORD cookie = TF_INVALID_COOKIE; |
- HRESULT hr = source->AdviseSink(IID_ITfLanguageProfileNotifySink, |
- this, |
- &cookie); |
- if (FAILED(hr)) { |
- LOG(ERROR) << "ITfSource::AdviseSink failed. hr = " << hr; |
- return false; |
- } |
- cookie_ = cookie; |
- source_ = source; |
- return true; |
- } |
- |
- void SetCallback(base::Closure on_language_chanaged) { |
- on_language_chanaged_ = on_language_chanaged; |
- } |
- |
- void Unadvise() { |
- if (cookie_ == TF_INVALID_COOKIE || !source_.get()) |
- return; |
- if (FAILED(source_->UnadviseSink(cookie_))) |
- return; |
- cookie_ = TF_INVALID_COOKIE; |
- source_.Release(); |
- } |
- |
- private: |
- // ITfLanguageProfileNotifySink overrides: |
- STDMETHOD(OnLanguageChange)(LANGID langid, BOOL *accept) override { |
- if (!accept) |
- return E_INVALIDARG; |
- *accept = TRUE; |
- return S_OK; |
- } |
- |
- STDMETHOD(OnLanguageChanged)() override { |
- if (!on_language_chanaged_.is_null()) |
- on_language_chanaged_.Run(); |
- return S_OK; |
- } |
- |
- base::Closure on_language_chanaged_; |
- base::win::ScopedComPtr<ITfSource> source_; |
- DWORD cookie_; |
- |
- DISALLOW_COPY_AND_ASSIGN(InputSourceMonitor); |
-}; |
- |
-class InputSourceImpl : public InputSource { |
- public: |
- InputSourceImpl(ITfInputProcessorProfileMgr* profile_manager, |
- InputSourceMonitor* monitor) |
- : profile_manager_(profile_manager), |
- monitor_(monitor) { |
- monitor_->SetCallback(base::Bind(&InputSourceImpl::OnLanguageChanged, |
- base::Unretained(this))); |
- } |
- ~InputSourceImpl() override { |
- monitor_->SetCallback(base::Closure()); |
- monitor_->Unadvise(); |
- } |
- |
- private: |
- // InputSource overrides. |
- bool GetActiveSource(LANGID* langid, bool* is_ime) override { |
- TF_INPUTPROCESSORPROFILE profile = {}; |
- HRESULT hr = profile_manager_->GetActiveProfile(GUID_TFCAT_TIP_KEYBOARD, |
- &profile); |
- if (FAILED(hr)) { |
- LOG(ERROR) << "ITfInputProcessorProfileMgr::GetActiveProfile failed." |
- << " hr = " << hr; |
- return false; |
- } |
- *langid = profile.langid; |
- *is_ime = profile.dwProfileType == TF_PROFILETYPE_INPUTPROCESSOR; |
- return true; |
- } |
- void AddObserver(InputSourceObserver* observer) override { |
- observer_list_.AddObserver(observer); |
- } |
- void RemoveObserver(InputSourceObserver* observer) override { |
- observer_list_.RemoveObserver(observer); |
- } |
- void OnLanguageChanged() { |
- FOR_EACH_OBSERVER(InputSourceObserver, |
- observer_list_, |
- OnInputSourceChanged()); |
- } |
- |
- base::win::ScopedComPtr<ITfInputProcessorProfileMgr> profile_manager_; |
- scoped_refptr<InputSourceMonitor> monitor_; |
- base::ObserverList<InputSourceObserver> observer_list_; |
- |
- DISALLOW_COPY_AND_ASSIGN(InputSourceImpl); |
-}; |
- |
-} // namespace |
- |
-// static |
-scoped_ptr<InputSource> InputSource::Create() { |
- ui::win::CreateATLModuleIfNeeded(); |
- |
- base::win::ScopedComPtr<ITfInputProcessorProfileMgr> profile_manager; |
- HRESULT hr = profile_manager.CreateInstance(CLSID_TF_InputProcessorProfiles); |
- if (FAILED(hr)) { |
- LOG(ERROR) << "Failed to instantiate CLSID_TF_InputProcessorProfiles." |
- << " hr = " << hr; |
- return scoped_ptr<InputSource>(); |
- } |
- base::win::ScopedComPtr<ITfSource> profiles_source; |
- hr = profiles_source.QueryFrom(profile_manager.get()); |
- if (FAILED(hr)) { |
- LOG(ERROR) << "QueryFrom to ITfSource failed. hr = " << hr; |
- return scoped_ptr<InputSource>(); |
- } |
- |
- CComObject<InputSourceMonitor>* monitor = NULL; |
- hr = CComObject<InputSourceMonitor>::CreateInstance(&monitor); |
- if (FAILED(hr)) { |
- LOG(ERROR) << "CComObject<InputSourceMonitor>::CreateInstance failed." |
- << " hr = " << hr; |
- return scoped_ptr<InputSource>(); |
- } |
- if (!monitor->Initialize(profiles_source.get())) { |
- LOG(ERROR) << "Failed to initialize the monitor."; |
- return scoped_ptr<InputSource>(); |
- } |
- |
- // Transfer the ownership. |
- return scoped_ptr<InputSource>( |
- new InputSourceImpl(profile_manager.get(), monitor)); |
-} |
- |
-} // namespace metro_driver |