1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/logging.h"
6 #include "base/strings/string_util.h"
7 #include "chromeos/ime/component_extension_ime_manager.h"
11 const char* kComponentExtensionIMEPrefix = "_comp_ime_";
14 ComponentExtensionEngine::ComponentExtensionEngine() {
17 ComponentExtensionEngine::~ComponentExtensionEngine() {
20 ComponentExtensionIME::ComponentExtensionIME() {
23 ComponentExtensionIME::~ComponentExtensionIME() {
26 ComponentExtensionIMEManagerDelegate::ComponentExtensionIMEManagerDelegate() {
29 ComponentExtensionIMEManagerDelegate::~ComponentExtensionIMEManagerDelegate() {
32 ComponentExtensionIMEManager::ComponentExtensionIMEManager()
33 : is_initialized_(false) {
36 ComponentExtensionIMEManager::~ComponentExtensionIMEManager() {
39 void ComponentExtensionIMEManager::Initialize(
40 scoped_ptr<ComponentExtensionIMEManagerDelegate> delegate) {
41 delegate_ = delegate.Pass();
42 component_extension_imes_ = delegate_->ListIME();
43 is_initialized_ = true;
44 FOR_EACH_OBSERVER(Observer, observers_, OnInitialized());
47 bool ComponentExtensionIMEManager::IsInitialized() {
48 return is_initialized_;
51 bool ComponentExtensionIMEManager::LoadComponentExtensionIME(
52 const std::string& input_method_id) {
53 ComponentExtensionIME ime;
54 if (FindEngineEntry(input_method_id, &ime, NULL))
55 return delegate_->Load(ime.id, ime.manifest, ime.path);
60 bool ComponentExtensionIMEManager::UnloadComponentExtensionIME(
61 const std::string& input_method_id) {
62 ComponentExtensionIME ime;
63 if (FindEngineEntry(input_method_id, &ime, NULL))
64 return delegate_->Unload(ime.id, ime.path);
70 std::string ComponentExtensionIMEManager::GetComponentExtensionIMEId(
71 const std::string& extension_id,
72 const std::string& engine_id) {
73 return kComponentExtensionIMEPrefix + extension_id + engine_id;
77 bool ComponentExtensionIMEManager::IsComponentExtensionIMEId(
78 const std::string& input_method_id) {
79 return StartsWithASCII(input_method_id,
80 kComponentExtensionIMEPrefix,
81 true); // Case sensitive.
84 bool ComponentExtensionIMEManager::IsWhitelisted(
85 const std::string& input_method_id) {
86 return IsComponentExtensionIMEId(input_method_id) &&
87 FindEngineEntry(input_method_id, NULL, NULL);
90 bool ComponentExtensionIMEManager::IsWhitelistedExtension(
91 const std::string& extension_id) {
92 for (size_t i = 0; i < component_extension_imes_.size(); ++i) {
93 if (component_extension_imes_[i].id == extension_id)
99 std::string ComponentExtensionIMEManager::GetId(
100 const std::string& extension_id,
101 const std::string& engine_id) {
102 ComponentExtensionEngine engine;
103 const std::string& input_method_id =
104 GetComponentExtensionIMEId(extension_id, engine_id);
105 if (!FindEngineEntry(input_method_id, NULL, &engine))
107 return input_method_id;
110 std::string ComponentExtensionIMEManager::GetName(
111 const std::string& input_method_id) {
112 ComponentExtensionEngine engine;
113 if (!FindEngineEntry(input_method_id, NULL, &engine))
115 return engine.display_name;
118 std::string ComponentExtensionIMEManager::GetDescription(
119 const std::string& input_method_id) {
120 ComponentExtensionEngine engine;
121 if (!FindEngineEntry(input_method_id, NULL, &engine))
123 return engine.description;
126 std::vector<std::string> ComponentExtensionIMEManager::ListIMEByLanguage(
127 const std::string& language) {
128 std::vector<std::string> result;
129 for (size_t i = 0; i < component_extension_imes_.size(); ++i) {
130 for (size_t j = 0; j < component_extension_imes_[i].engines.size(); ++j) {
131 const ComponentExtensionIME& ime = component_extension_imes_[i];
132 if (std::find(ime.engines[j].language_codes.begin(),
133 ime.engines[j].language_codes.end(),
134 language) != ime.engines[j].language_codes.end()) {
135 result.push_back(GetComponentExtensionIMEId(ime.id,
136 ime.engines[j].engine_id));
143 input_method::InputMethodDescriptors
144 ComponentExtensionIMEManager::GetAllIMEAsInputMethodDescriptor() {
145 input_method::InputMethodDescriptors result;
146 for (size_t i = 0; i < component_extension_imes_.size(); ++i) {
147 for (size_t j = 0; j < component_extension_imes_[i].engines.size(); ++j) {
149 input_method::InputMethodDescriptor(
150 GetComponentExtensionIMEId(
151 component_extension_imes_[i].id,
152 component_extension_imes_[i].engines[j].engine_id),
153 component_extension_imes_[i].engines[j].display_name,
154 component_extension_imes_[i].engines[j].layouts,
155 component_extension_imes_[i].engines[j].language_codes,
156 false, // Do not use IME on login screen.
157 component_extension_imes_[i].options_page_url));
163 void ComponentExtensionIMEManager::AddObserver(Observer* observer) {
164 observers_.AddObserver(observer);
167 void ComponentExtensionIMEManager::RemoveObserver(Observer* observer) {
168 observers_.RemoveObserver(observer);
171 bool ComponentExtensionIMEManager::FindEngineEntry(
172 const std::string& input_method_id,
173 ComponentExtensionIME* out_extension,
174 ComponentExtensionEngine* out_engine) {
175 if (!IsComponentExtensionIMEId(input_method_id))
177 for (size_t i = 0; i < component_extension_imes_.size(); ++i) {
178 const std::string extension_id = component_extension_imes_[i].id;
179 const std::vector<ComponentExtensionEngine>& engines =
180 component_extension_imes_[i].engines;
182 for (size_t j = 0; j < engines.size(); ++j) {
183 const std::string trial_ime_id = GetComponentExtensionIMEId(
184 extension_id, engines[j].engine_id);
185 if (trial_ime_id != input_method_id)
189 *out_extension = component_extension_imes_[i];
191 *out_engine = component_extension_imes_[i].engines[j];
198 } // namespace chromeos