| // 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 "chromeos/ime/component_extension_ime_manager.h" |
| |
| #include "base/logging.h" |
| #include "base/strings/string_util.h" |
| #include "chromeos/ime/extension_ime_util.h" |
| |
| namespace chromeos { |
| |
| ComponentExtensionEngine::ComponentExtensionEngine() { |
| } |
| |
| ComponentExtensionEngine::~ComponentExtensionEngine() { |
| } |
| |
| ComponentExtensionIME::ComponentExtensionIME() { |
| } |
| |
| ComponentExtensionIME::~ComponentExtensionIME() { |
| } |
| |
| ComponentExtensionIMEManagerDelegate::ComponentExtensionIMEManagerDelegate() { |
| } |
| |
| ComponentExtensionIMEManagerDelegate::~ComponentExtensionIMEManagerDelegate() { |
| } |
| |
| ComponentExtensionIMEManager::ComponentExtensionIMEManager() |
| : is_initialized_(false) { |
| } |
| |
| ComponentExtensionIMEManager::~ComponentExtensionIMEManager() { |
| } |
| |
| void ComponentExtensionIMEManager::Initialize( |
| scoped_ptr<ComponentExtensionIMEManagerDelegate> delegate) { |
| delegate_ = delegate.Pass(); |
| component_extension_imes_ = delegate_->ListIME(); |
| is_initialized_ = true; |
| FOR_EACH_OBSERVER(Observer, observers_, OnInitialized()); |
| } |
| |
| bool ComponentExtensionIMEManager::IsInitialized() { |
| return is_initialized_; |
| } |
| |
| bool ComponentExtensionIMEManager::LoadComponentExtensionIME( |
| const std::string& input_method_id) { |
| ComponentExtensionIME ime; |
| if (FindEngineEntry(input_method_id, &ime, NULL)) |
| return delegate_->Load(ime.id, ime.manifest, ime.path); |
| else |
| return false; |
| } |
| |
| bool ComponentExtensionIMEManager::UnloadComponentExtensionIME( |
| const std::string& input_method_id) { |
| ComponentExtensionIME ime; |
| if (FindEngineEntry(input_method_id, &ime, NULL)) |
| return delegate_->Unload(ime.id, ime.path); |
| else |
| return false; |
| } |
| |
| bool ComponentExtensionIMEManager::IsWhitelisted( |
| const std::string& input_method_id) { |
| return extension_ime_util::IsComponentExtensionIME(input_method_id) && |
| FindEngineEntry(input_method_id, NULL, NULL); |
| } |
| |
| bool ComponentExtensionIMEManager::IsWhitelistedExtension( |
| const std::string& extension_id) { |
| for (size_t i = 0; i < component_extension_imes_.size(); ++i) { |
| if (component_extension_imes_[i].id == extension_id) |
| return true; |
| } |
| return false; |
| } |
| |
| std::string ComponentExtensionIMEManager::GetId( |
| const std::string& extension_id, |
| const std::string& engine_id) { |
| ComponentExtensionEngine engine; |
| const std::string& input_method_id = |
| extension_ime_util::GetComponentInputMethodID(extension_id, engine_id); |
| if (!FindEngineEntry(input_method_id, NULL, &engine)) |
| return ""; |
| return input_method_id; |
| } |
| |
| std::string ComponentExtensionIMEManager::GetName( |
| const std::string& input_method_id) { |
| ComponentExtensionEngine engine; |
| if (!FindEngineEntry(input_method_id, NULL, &engine)) |
| return ""; |
| return engine.display_name; |
| } |
| |
| std::string ComponentExtensionIMEManager::GetDescription( |
| const std::string& input_method_id) { |
| ComponentExtensionEngine engine; |
| if (!FindEngineEntry(input_method_id, NULL, &engine)) |
| return ""; |
| return engine.description; |
| } |
| |
| std::vector<std::string> ComponentExtensionIMEManager::ListIMEByLanguage( |
| const std::string& language) { |
| std::vector<std::string> result; |
| for (size_t i = 0; i < component_extension_imes_.size(); ++i) { |
| for (size_t j = 0; j < component_extension_imes_[i].engines.size(); ++j) { |
| const ComponentExtensionIME& ime = component_extension_imes_[i]; |
| if (std::find(ime.engines[j].language_codes.begin(), |
| ime.engines[j].language_codes.end(), |
| language) != ime.engines[j].language_codes.end()) { |
| result.push_back(extension_ime_util::GetComponentInputMethodID( |
| ime.id, |
| ime.engines[j].engine_id)); |
| } |
| } |
| } |
| return result; |
| } |
| |
| input_method::InputMethodDescriptors |
| ComponentExtensionIMEManager::GetAllIMEAsInputMethodDescriptor() { |
| input_method::InputMethodDescriptors result; |
| for (size_t i = 0; i < component_extension_imes_.size(); ++i) { |
| for (size_t j = 0; j < component_extension_imes_[i].engines.size(); ++j) { |
| result.push_back( |
| input_method::InputMethodDescriptor( |
| extension_ime_util::GetComponentInputMethodID( |
| component_extension_imes_[i].id, |
| component_extension_imes_[i].engines[j].engine_id), |
| component_extension_imes_[i].engines[j].display_name, |
| component_extension_imes_[i].engines[j].layouts, |
| component_extension_imes_[i].engines[j].language_codes, |
| false, // Do not use IME on login screen. |
| component_extension_imes_[i].options_page_url, |
| component_extension_imes_[i].input_view_url)); |
| } |
| } |
| return result; |
| } |
| |
| void ComponentExtensionIMEManager::AddObserver(Observer* observer) { |
| observers_.AddObserver(observer); |
| } |
| |
| void ComponentExtensionIMEManager::RemoveObserver(Observer* observer) { |
| observers_.RemoveObserver(observer); |
| } |
| |
| bool ComponentExtensionIMEManager::FindEngineEntry( |
| const std::string& input_method_id, |
| ComponentExtensionIME* out_extension, |
| ComponentExtensionEngine* out_engine) { |
| if (!extension_ime_util::IsComponentExtensionIME(input_method_id)) |
| return false; |
| for (size_t i = 0; i < component_extension_imes_.size(); ++i) { |
| const std::string extension_id = component_extension_imes_[i].id; |
| const std::vector<ComponentExtensionEngine>& engines = |
| component_extension_imes_[i].engines; |
| |
| for (size_t j = 0; j < engines.size(); ++j) { |
| const std::string trial_ime_id = |
| extension_ime_util::GetComponentInputMethodID( |
| extension_id, engines[j].engine_id); |
| if (trial_ime_id != input_method_id) |
| continue; |
| |
| if (out_extension) |
| *out_extension = component_extension_imes_[i]; |
| if (out_engine) |
| *out_engine = component_extension_imes_[i].engines[j]; |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| } // namespace chromeos |