1 // Copyright (c) 2012 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. 4 5 #include "chromeos/dbus/ibus/ibus_component.h" 6 7 #include "base/logging.h" 8 #include "chromeos/dbus/ibus/ibus_object.h" 9 #include "dbus/message.h" 10 11 namespace chromeos { 12 13 namespace { 14 15 bool PopIBusEngineDesc(dbus::MessageReader* reader, 16 IBusComponent::EngineDescription* engine_desc) { 17 IBusObjectReader ibus_object_reader("IBusEngineDesc", reader); 18 if (!ibus_object_reader.Init()) 19 return false; 20 if (!ibus_object_reader.PopString(&engine_desc->engine_id)) { 21 LOG(ERROR) << "Invalid variant structure[IBusEngineDesc]: " 22 << "The 1st argument should be string."; 23 return false; 24 } 25 if (!ibus_object_reader.PopString(&engine_desc->display_name)) { 26 LOG(ERROR) << "Invalid variant structure[IBusEngineDesc]: " 27 << "The 2nd argument should be string."; 28 return false; 29 } 30 if (!ibus_object_reader.PopString(&engine_desc->description)) { 31 LOG(ERROR) << "Invalid variant structure[IBusEngineDesc]: " 32 << "The 3rd argument should be string."; 33 return false; 34 } 35 if (!ibus_object_reader.PopString(&engine_desc->language_code)) { 36 LOG(ERROR) << "Invalid variant structure[IBusEngineDesc]: " 37 << "The 4th argument should be string."; 38 return false; 39 } 40 std::string unused_string_field; 41 if (!ibus_object_reader.PopString(&unused_string_field)) { 42 LOG(ERROR) << "Invalid variant structure[IBusEngineDesc]: " 43 << "The 5th argument should be string."; 44 return false; 45 } 46 if (!ibus_object_reader.PopString(&engine_desc->author)) { 47 LOG(ERROR) << "Invalid variant structure[IBusEngineDesc]: " 48 << "The 6th argument should be string."; 49 return false; 50 } 51 if (!ibus_object_reader.PopString(&unused_string_field)) { 52 LOG(ERROR) << "Invalid variant structure[IBusEngineDesc]: " 53 << "The 7th argument should be string."; 54 return false; 55 } 56 if (!ibus_object_reader.PopString(&unused_string_field)) { 57 LOG(ERROR) << "Invalid variant structure[IBusEngineDesc]: " 58 << "The 8th argument should be string."; 59 return false; 60 } 61 uint32 unused_uint_field = 0; 62 if (!ibus_object_reader.PopUint32(&unused_uint_field)) { 63 LOG(ERROR) << "Invalid variant structure[IBusEngineDesc]: " 64 << "The 9th argument should be unsigned integer."; 65 return false; 66 } 67 if (!ibus_object_reader.PopString(&unused_string_field)) { 68 LOG(ERROR) << "Invalid variant structure[IBusEngineDesc]: " 69 << "The 10th argument should be string."; 70 return false; 71 } 72 if (!ibus_object_reader.PopString(&unused_string_field)) { 73 LOG(ERROR) << "Invalid variant structure[IBusEngineDesc]: " 74 << "The 11th argument should be string."; 75 return false; 76 } 77 if (!ibus_object_reader.PopString(&unused_string_field)) { 78 LOG(ERROR) << "Invalid variant structure[IBusEngineDesc]: " 79 << "The 12th argument should be string."; 80 return false; 81 } 82 return true; 83 } 84 85 void AppendIBusEngineDesc(const IBusComponent::EngineDescription& engine_desc, 86 dbus::MessageWriter* writer) { 87 IBusObjectWriter ibus_object_writer("IBusEngineDesc", 88 "ssssssssusss", 89 writer); 90 ibus_object_writer.CloseHeader(); 91 ibus_object_writer.AppendString(engine_desc.engine_id); 92 ibus_object_writer.AppendString(engine_desc.display_name); 93 ibus_object_writer.AppendString(engine_desc.description); 94 ibus_object_writer.AppendString(engine_desc.language_code); 95 ibus_object_writer.AppendString(""); // The license field is not used. 96 ibus_object_writer.AppendString(engine_desc.author); 97 ibus_object_writer.AppendString(""); // The icon path field is not used. 98 ibus_object_writer.AppendString(""); // The layout field is not used. 99 ibus_object_writer.AppendUint32(0); // The engine rank is not used. 100 ibus_object_writer.AppendString(""); // The hotkey field is not used. 101 ibus_object_writer.AppendString(""); // The symbol field is not used. 102 ibus_object_writer.AppendString(""); // The command line field is not used. 103 ibus_object_writer.CloseAll(); 104 } 105 106 } // namespace 107 108 bool CHROMEOS_EXPORT PopIBusComponent(dbus::MessageReader* reader, 109 IBusComponent* ibus_component) { 110 IBusObjectReader ibus_object_reader("IBusComponent", reader); 111 if (!ibus_object_reader.Init()) 112 return false; 113 std::string name; 114 if (!ibus_object_reader.PopString(&name)) { 115 LOG(ERROR) << "Invalid variant structure[IBusComponent]: " 116 << "The 1st argument should be string."; 117 return false; 118 } 119 ibus_component->set_name(name); 120 121 std::string description; 122 if (!ibus_object_reader.PopString(&description)) { 123 LOG(ERROR) << "Invalid variant structure[IBusComponent]: " 124 << "The 2nd argument should be string."; 125 return false; 126 } 127 ibus_component->set_description(description); 128 129 std::string unused_string_field; 130 if (!ibus_object_reader.PopString(&unused_string_field)) { 131 LOG(ERROR) << "Invalid variant structure[IBusComponent]: " 132 << "The 3rd argument should be string."; 133 return false; 134 } 135 if (!ibus_object_reader.PopString(&unused_string_field)) { 136 LOG(ERROR) << "Invalid variant structure[IBusComponent]: " 137 << "The 4th argument should be string."; 138 return false; 139 } 140 141 std::string author; 142 if (!ibus_object_reader.PopString(&author)) { 143 LOG(ERROR) << "Invalid variant structure[IBusComponent]: " 144 << "The 5th argument should be string."; 145 return false; 146 } 147 ibus_component->set_author(author); 148 149 if (!ibus_object_reader.PopString(&unused_string_field)) { 150 LOG(ERROR) << "Invalid variant structure[IBusComponent]: " 151 << "The 6th argument should be string."; 152 return false; 153 } 154 if (!ibus_object_reader.PopString(&unused_string_field)) { 155 LOG(ERROR) << "Invalid variant structure[IBusComponent]: " 156 << "The 7th argument should be string."; 157 return false; 158 } 159 if (!ibus_object_reader.PopString(&unused_string_field)) { 160 LOG(ERROR) << "Invalid variant structure[IBusComponent]: " 161 << "The 8th argument should be string."; 162 return false; 163 } 164 dbus::MessageReader observer_reader(NULL); 165 if (!ibus_object_reader.PopArray(&observer_reader)) { 166 LOG(ERROR) << "Invalid variant structure[IBusComponent]: " 167 << "The 9th argument should be array of variant."; 168 return false; 169 } 170 171 dbus::MessageReader engine_array_reader(NULL); 172 if (!ibus_object_reader.PopArray(&engine_array_reader)) { 173 LOG(ERROR) << "Invalid variant structure[IBusComponent]: " 174 << "The 10th argument should be array of IBusEngineDesc"; 175 return false; 176 } 177 std::vector<IBusComponent::EngineDescription>* engine_description = 178 ibus_component->mutable_engine_description(); 179 engine_description->clear(); 180 while (engine_array_reader.HasMoreData()) { 181 IBusComponent::EngineDescription engine_description_entry; 182 if (!PopIBusEngineDesc(&engine_array_reader, &engine_description_entry)) { 183 LOG(ERROR) << "Invalid variant structure[IBusComponent]: " 184 << "The 11th argument should be array of IBusEngineDesc"; 185 return false; 186 } 187 engine_description->push_back(engine_description_entry); 188 } 189 return true; 190 } 191 192 void CHROMEOS_EXPORT AppendIBusComponent(const IBusComponent& ibus_component, 193 dbus::MessageWriter* writer) { 194 IBusObjectWriter ibus_object_writer("IBusComponent", "ssssssssavav", writer); 195 ibus_object_writer.CloseHeader(); 196 ibus_object_writer.AppendString(ibus_component.name()); 197 ibus_object_writer.AppendString(ibus_component.description()); 198 ibus_object_writer.AppendString(""); // The version string is not used. 199 ibus_object_writer.AppendString(""); // The license field is not used. 200 ibus_object_writer.AppendString(ibus_component.author()); 201 ibus_object_writer.AppendString(""); // The URL field is not used. 202 ibus_object_writer.AppendString(""); // The exec path field is not used. 203 ibus_object_writer.AppendString(""); // The text domain field is not used. 204 // The observed object field is not used. 205 dbus::MessageWriter empty_array_writer(NULL); 206 ibus_object_writer.OpenArray("v", &empty_array_writer); 207 ibus_object_writer.CloseContainer(&empty_array_writer); 208 209 dbus::MessageWriter engine_descs_writer(NULL); 210 const std::vector<IBusComponent::EngineDescription> engine_description = 211 ibus_component.engine_description(); 212 ibus_object_writer.OpenArray("v", &engine_descs_writer); 213 for (size_t i = 0; i < engine_description.size(); ++i) { 214 AppendIBusEngineDesc(engine_description[i], &engine_descs_writer); 215 } 216 ibus_object_writer.CloseContainer(&engine_descs_writer); 217 ibus_object_writer.CloseAll(); 218 } 219 220 /////////////////////////////////////////////////////////////////////////////// 221 // IBusComponent 222 IBusComponent::IBusComponent() { 223 } 224 225 IBusComponent::~IBusComponent() { 226 } 227 228 IBusComponent::EngineDescription::EngineDescription() { 229 } 230 231 IBusComponent::EngineDescription::EngineDescription( 232 const std::string& engine_id, 233 const std::string& display_name, 234 const std::string& description, 235 const std::string& language_code, 236 const std::string& author) 237 : engine_id(engine_id), 238 display_name(display_name), 239 description(description), 240 language_code(language_code), 241 author(author) { 242 } 243 244 IBusComponent::EngineDescription::~EngineDescription() { 245 } 246 247 } // namespace chromeos 248