// 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