Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(109)

Side by Side Diff: chromeos/dbus/ibus/ibus_object.cc

Issue 11361210: Extends IBusObject to handle attachment field. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Making constant for attachment key. Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chromeos/dbus/ibus/ibus_object.h" 5 #include "chromeos/dbus/ibus/ibus_object.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/values.h"
8 #include "chromeos/dbus/ibus/ibus_property.h" 9 #include "chromeos/dbus/ibus/ibus_property.h"
9 #include "chromeos/dbus/ibus/ibus_text.h" 10 #include "chromeos/dbus/ibus/ibus_text.h"
10 #include "dbus/message.h" 11 #include "dbus/message.h"
12 #include "dbus/values_util.h"
11 13
12 namespace chromeos { 14 namespace chromeos {
13 // TODO(nona): Remove ibus namespace after complete libibus removal. 15 // TODO(nona): Remove ibus namespace after complete libibus removal.
14 namespace ibus { 16 namespace ibus {
15 17
16 /////////////////////////////////////////////////////////////////////////////// 18 ///////////////////////////////////////////////////////////////////////////////
17 // IBusObjectReader 19 // IBusObjectReader
18 IBusObjectReader::IBusObjectReader(const std::string& type_name, 20 IBusObjectReader::IBusObjectReader(const std::string& type_name,
19 dbus::MessageReader* reader) 21 dbus::MessageReader* reader)
20 : type_name_(type_name), 22 : type_name_(type_name),
21 original_reader_(reader), 23 original_reader_(reader),
22 top_variant_reader_(NULL), 24 top_variant_reader_(NULL),
23 contents_reader_(NULL), 25 contents_reader_(NULL),
24 check_result_(IBUS_OBJECT_NOT_CHECKED) { 26 check_result_(IBUS_OBJECT_NOT_CHECKED) {
25 } 27 }
26 28
27 IBusObjectReader::~IBusObjectReader() { 29 IBusObjectReader::~IBusObjectReader() {
30 for (std::map<std::string, base::Value*>::iterator ite = attachments_.begin();
31 ite != attachments_.end(); ++ite)
32 delete ite->second;
28 } 33 }
29 34
30 bool IBusObjectReader::InitWithoutAttachment() { 35 bool IBusObjectReader::Init() {
31 DCHECK(original_reader_); 36 DCHECK(original_reader_);
32 DCHECK_EQ(IBUS_OBJECT_NOT_CHECKED, check_result_); 37 DCHECK_EQ(IBUS_OBJECT_NOT_CHECKED, check_result_);
33 38
34 top_variant_reader_.reset(new dbus::MessageReader(NULL)); 39 top_variant_reader_.reset(new dbus::MessageReader(NULL));
35 contents_reader_.reset(new dbus::MessageReader(NULL)); 40 contents_reader_.reset(new dbus::MessageReader(NULL));
36 check_result_ = IBUS_OBJECT_INVALID; 41 check_result_ = IBUS_OBJECT_INVALID;
37 42
38 // IBus object has a variant on top-level. 43 // IBus object has a variant on top-level.
39 if (!original_reader_->PopVariant(top_variant_reader_.get())) { 44 if (!original_reader_->PopVariant(top_variant_reader_.get())) {
40 LOG(ERROR) << "Invalid object structure[" << type_name_ << "]: " 45 LOG(ERROR) << "Invalid object structure[" << type_name_ << "]: "
(...skipping 15 matching lines...) Expand all
56 << "Can not get type name field."; 61 << "Can not get type name field.";
57 return false; 62 return false;
58 } 63 }
59 64
60 if (type_name != type_name_) { 65 if (type_name != type_name_) {
61 LOG(ERROR) << "Type check failed: Given variant is not " << type_name_ 66 LOG(ERROR) << "Type check failed: Given variant is not " << type_name_
62 << " and actual type is " << type_name << "."; 67 << " and actual type is " << type_name << ".";
63 return false; 68 return false;
64 } 69 }
65 70
66 return true; 71 dbus::MessageReader attachment_reader(NULL);
67 }
68 72
69 bool IBusObjectReader::Init() { 73 // IBus object has array object at the second element, which is used in
70 if (!InitWithoutAttachment()) 74 // attaching additional information.
71 return false; 75 if (!contents_reader_->PopArray(&attachment_reader)) {
72
73 // Ignores attachment field.
74 dbus::MessageReader array_reader(NULL);
75 if (!contents_reader_->PopArray(&array_reader)) {
76 LOG(ERROR) << "Invalid object structure[" << type_name_ << "] " 76 LOG(ERROR) << "Invalid object structure[" << type_name_ << "] "
77 << "can not find attachment array field."; 77 << "can not find attachment array field.";
78 return false; 78 return false;
79 } 79 }
80 DLOG_IF(WARNING, array_reader.HasMoreData())
81 << "Ignoring attachment field in " << type_name_ <<".";
82 check_result_ = IBUS_OBJECT_VALID;
83 return true;
84 }
85 80
86 bool IBusObjectReader::InitWithAttachmentReader(dbus::MessageReader* reader) { 81 while (attachment_reader.HasMoreData()) {
87 DCHECK(reader); 82 dbus::MessageReader dictionary_reader(NULL);
88 if (!InitWithoutAttachment()) 83 if (!attachment_reader.PopDictEntry(&dictionary_reader)) {
89 return false; 84 LOG(ERROR) << "Invalid attachment structure: "
85 << "The attachment field is array of dictionary entry.";
86 return false;
87 }
90 88
91 // IBus object has array object at the second element, which is used in 89 std::string key;
92 // attaching additional information. 90 if (!dictionary_reader.PopString(&key)) {
93 if (!contents_reader_->PopArray(reader)) { 91 LOG(ERROR) << "Invalid attachement structure: "
94 LOG(ERROR) << "Invalid object structure[" << type_name_ << "] " 92 << "The 1st dictionary entry should be string.";
95 << "can not find attachment array field."; 93 return false;
96 return false; 94 }
95
96 if (key.empty()) {
97 LOG(ERROR) << "Invalid attachement key: key is empty.";
98 return false;
99 }
100
101 dbus::MessageReader variant_reader(NULL);
102 if (!dictionary_reader.PopVariant(&variant_reader)) {
103 LOG(ERROR) << "Invalid attachment structure: "
104 << "The 2nd dictionary entry shuold be variant.";
105 return false;
106 }
107
108 dbus::MessageReader sub_variant_reader(NULL);
109 if (!variant_reader.PopVariant(&sub_variant_reader)) {
110 LOG(ERROR) << "Invalid attachment structure: "
111 << "The 2nd variant entry should contain variant.";
112 return false;
113 }
114
115 attachments_[key] = dbus::PopDataAsValue(&sub_variant_reader);
97 } 116 }
98 check_result_ = IBUS_OBJECT_VALID; 117 check_result_ = IBUS_OBJECT_VALID;
99 return true; 118 return true;
100 } 119 }
101 120
102 bool IBusObjectReader::InitWithParentReader(dbus::MessageReader* reader) { 121 bool IBusObjectReader::InitWithParentReader(dbus::MessageReader* reader) {
103 original_reader_ = reader; 122 original_reader_ = reader;
104 return Init(); 123 return Init();
105 } 124 }
106 125
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 property); 173 property);
155 } 174 }
156 175
157 bool IBusObjectReader::PopIBusPropertyList(IBusPropertyList* properties) { 176 bool IBusObjectReader::PopIBusPropertyList(IBusPropertyList* properties) {
158 DCHECK_NE(IBUS_OBJECT_NOT_CHECKED, check_result_); 177 DCHECK_NE(IBUS_OBJECT_NOT_CHECKED, check_result_);
159 DCHECK(contents_reader_.get()); 178 DCHECK(contents_reader_.get());
160 return IsValid() && chromeos::ibus::PopIBusPropertyList( 179 return IsValid() && chromeos::ibus::PopIBusPropertyList(
161 contents_reader_.get(), properties); 180 contents_reader_.get(), properties);
162 } 181 }
163 182
183 bool IBusObjectReader::GetAttachment(const std::string& key,
184 base::Value** value) {
185 DCHECK_NE(IBUS_OBJECT_NOT_CHECKED, check_result_);
186 DCHECK(contents_reader_.get());
187 DCHECK(value);
188 if (!IsValid())
189 return false;
190 std::map<std::string, base::Value*>::iterator it = attachments_.find(key);
191 if (it == attachments_.end())
192 return false;
193 *value = it->second;
194 return true;
195 }
196
164 bool IBusObjectReader::HasMoreData() { 197 bool IBusObjectReader::HasMoreData() {
165 DCHECK_NE(IBUS_OBJECT_NOT_CHECKED, check_result_); 198 DCHECK_NE(IBUS_OBJECT_NOT_CHECKED, check_result_);
166 DCHECK(contents_reader_.get()); 199 DCHECK(contents_reader_.get());
167 return IsValid() && contents_reader_->HasMoreData(); 200 return IsValid() && contents_reader_->HasMoreData();
168 } 201 }
169 202
170 bool IBusObjectReader::PopIBusObject(IBusObjectReader* reader) { 203 bool IBusObjectReader::PopIBusObject(IBusObjectReader* reader) {
171 DCHECK(contents_reader_.get()); 204 DCHECK(contents_reader_.get());
172 if (!IsValid()) 205 if (!IsValid())
173 return false; 206 return false;
174 return reader->InitWithParentReader(contents_reader_.get()); 207 return reader->InitWithParentReader(contents_reader_.get());
175 } 208 }
176 209
177 bool IBusObjectReader::IsValid() const { 210 bool IBusObjectReader::IsValid() const {
178 DCHECK_NE(IBUS_OBJECT_NOT_CHECKED, check_result_); 211 DCHECK_NE(IBUS_OBJECT_NOT_CHECKED, check_result_);
179 return check_result_ == IBUS_OBJECT_VALID; 212 return check_result_ == IBUS_OBJECT_VALID;
180 } 213 }
181 214
182 /////////////////////////////////////////////////////////////////////////////// 215 ///////////////////////////////////////////////////////////////////////////////
183 // IBusObjectWriter 216 // IBusObjectWriter
184 IBusObjectWriter::IBusObjectWriter(const std::string& type_name, 217 IBusObjectWriter::IBusObjectWriter(const std::string& type_name,
185 const std::string& signature, 218 const std::string& signature,
186 dbus::MessageWriter* writer) 219 dbus::MessageWriter* writer)
187 : type_name_(type_name), 220 : type_name_(type_name),
188 signature_(signature), 221 signature_(signature),
189 original_writer_(writer) { 222 original_writer_(writer),
223 state_(NOT_INITIALZED) {
190 if (original_writer_) 224 if (original_writer_)
191 Init(); 225 Init();
192 } 226 }
193 227
194 IBusObjectWriter::~IBusObjectWriter() { 228 IBusObjectWriter::~IBusObjectWriter() {
195 } 229 }
196 230
197 void IBusObjectWriter::AppendString(const std::string& input) { 231 void IBusObjectWriter::AppendString(const std::string& input) {
198 DCHECK(IsInitialized()); 232 DCHECK_EQ(state_, INITIALIZED);
199 contents_writer_->AppendString(input); 233 contents_writer_->AppendString(input);
200 } 234 }
201 235
202 void IBusObjectWriter::AppendUint32(uint32 input) { 236 void IBusObjectWriter::AppendUint32(uint32 input) {
203 DCHECK(IsInitialized()); 237 DCHECK_EQ(state_, INITIALIZED);
204 contents_writer_->AppendUint32(input); 238 contents_writer_->AppendUint32(input);
205 } 239 }
206 240
207 void IBusObjectWriter::AppendInt32(int32 input) { 241 void IBusObjectWriter::AppendInt32(int32 input) {
208 DCHECK(IsInitialized()); 242 DCHECK_EQ(state_, INITIALIZED);
209 contents_writer_->AppendInt32(input); 243 contents_writer_->AppendInt32(input);
210 } 244 }
211 245
212 void IBusObjectWriter::AppendBool(bool input) { 246 void IBusObjectWriter::AppendBool(bool input) {
213 DCHECK(IsInitialized()); 247 DCHECK_EQ(state_, INITIALIZED);
214 contents_writer_->AppendBool(input); 248 contents_writer_->AppendBool(input);
215 } 249 }
216 250
217 void IBusObjectWriter::OpenArray(const std::string& signature, 251 void IBusObjectWriter::OpenArray(const std::string& signature,
218 dbus::MessageWriter* writer) { 252 dbus::MessageWriter* writer) {
219 DCHECK(IsInitialized()); 253 DCHECK_EQ(state_, INITIALIZED);
220 contents_writer_->OpenArray(signature, writer); 254 contents_writer_->OpenArray(signature, writer);
221 } 255 }
222 256
223 void IBusObjectWriter::AppendIBusText(const IBusText& text) { 257 void IBusObjectWriter::AppendIBusText(const IBusText& text) {
224 DCHECK(IsInitialized()); 258 DCHECK_EQ(state_, INITIALIZED);
225 chromeos::ibus::AppendIBusText(text, contents_writer_.get()); 259 chromeos::ibus::AppendIBusText(text, contents_writer_.get());
226 } 260 }
227 261
228 void IBusObjectWriter::AppendStringAsIBusText(const std::string& text) { 262 void IBusObjectWriter::AppendStringAsIBusText(const std::string& text) {
229 DCHECK(IsInitialized()); 263 DCHECK_EQ(state_, INITIALIZED);
230 chromeos::ibus::AppendStringAsIBusText(text, contents_writer_.get()); 264 chromeos::ibus::AppendStringAsIBusText(text, contents_writer_.get());
231 } 265 }
232 266
233 void IBusObjectWriter::AppendIBusProperty(const IBusProperty& property) { 267 void IBusObjectWriter::AppendIBusProperty(const IBusProperty& property) {
234 DCHECK(IsInitialized()); 268 DCHECK_EQ(state_, INITIALIZED);
235 chromeos::ibus::AppendIBusProperty(property, contents_writer_.get()); 269 chromeos::ibus::AppendIBusProperty(property, contents_writer_.get());
236 } 270 }
237 271
238 void IBusObjectWriter::AppendIBusPropertyList( 272 void IBusObjectWriter::AppendIBusPropertyList(
239 const IBusPropertyList& property_list) { 273 const IBusPropertyList& property_list) {
240 DCHECK(IsInitialized()); 274 DCHECK_EQ(state_, INITIALIZED);
241 chromeos::ibus::AppendIBusPropertyList(property_list, contents_writer_.get()); 275 chromeos::ibus::AppendIBusPropertyList(property_list, contents_writer_.get());
242 } 276 }
243 277
244 void IBusObjectWriter::CloseContainer(dbus::MessageWriter* writer) { 278 void IBusObjectWriter::CloseContainer(dbus::MessageWriter* writer) {
245 DCHECK(IsInitialized()); 279 DCHECK_EQ(state_, INITIALIZED);
246 contents_writer_->CloseContainer(writer); 280 contents_writer_->CloseContainer(writer);
247 } 281 }
248 282
249 void IBusObjectWriter::AppendIBusObject(IBusObjectWriter* writer) { 283 void IBusObjectWriter::AppendIBusObject(IBusObjectWriter* writer) {
250 DCHECK(IsInitialized()); 284 DCHECK_EQ(state_, INITIALIZED);
251 DCHECK(!writer->IsInitialized()) << "Given writer is already initialized";
252
253 writer->InitWithParentWriter(contents_writer_.get()); 285 writer->InitWithParentWriter(contents_writer_.get());
254 } 286 }
255 287
256 void IBusObjectWriter::Init() { 288 void IBusObjectWriter::Init() {
257 DCHECK(original_writer_); 289 DCHECK(original_writer_);
258 DCHECK(!IsInitialized()); 290 DCHECK_EQ(state_, NOT_INITIALZED);
259 291
260 top_variant_writer_.reset(new dbus::MessageWriter(NULL)); 292 top_variant_writer_.reset(new dbus::MessageWriter(NULL));
261 contents_writer_.reset(new dbus::MessageWriter(NULL)); 293 contents_writer_.reset(new dbus::MessageWriter(NULL));
294 attachment_writer_.reset(new dbus::MessageWriter(NULL));
262 295
263 const std::string ibus_signature = "(sa{sv}" + signature_ + ")"; 296 const std::string ibus_signature = "(sa{sv}" + signature_ + ")";
264 original_writer_->OpenVariant(ibus_signature, top_variant_writer_.get()); 297 original_writer_->OpenVariant(ibus_signature, top_variant_writer_.get());
265 top_variant_writer_->OpenStruct(contents_writer_.get()); 298 top_variant_writer_->OpenStruct(contents_writer_.get());
266 299
267 contents_writer_->AppendString(type_name_); 300 contents_writer_->AppendString(type_name_);
268 dbus::MessageWriter header_array_writer(NULL);
269 301
270 // There is no case setting any attachment in ChromeOS, so setting empty 302 contents_writer_->OpenArray("{sv}", attachment_writer_.get());
271 // array is enough. 303 state_ = HEADER_OPEN;
272 contents_writer_->OpenArray("{sv}", &header_array_writer);
273 contents_writer_->CloseContainer(&header_array_writer);
274 } 304 }
275 305
276 void IBusObjectWriter::InitWithParentWriter(dbus::MessageWriter* writer) { 306 void IBusObjectWriter::InitWithParentWriter(dbus::MessageWriter* writer) {
307 DCHECK_EQ(state_, NOT_INITIALZED) << "Already initialized.";
277 original_writer_ = writer; 308 original_writer_ = writer;
278 Init(); 309 Init();
279 } 310 }
280 311
281 void IBusObjectWriter::CloseAll() { 312 void IBusObjectWriter::CloseAll() {
282 DCHECK(original_writer_); 313 DCHECK(original_writer_);
283 DCHECK(IsInitialized()); 314 DCHECK_NE(state_, NOT_INITIALZED);
315 if (state_ == HEADER_OPEN)
316 CloseHeader();
284 317
285 top_variant_writer_->CloseContainer(contents_writer_.get()); 318 top_variant_writer_->CloseContainer(contents_writer_.get());
286 original_writer_->CloseContainer(top_variant_writer_.get()); 319 original_writer_->CloseContainer(top_variant_writer_.get());
287 top_variant_writer_.reset(); 320 top_variant_writer_.reset();
288 contents_writer_.reset(); 321 contents_writer_.reset();
289 } 322 }
290 323
291 bool IBusObjectWriter::IsInitialized() const { 324 void IBusObjectWriter::CloseHeader() {
292 return contents_writer_.get() != NULL; 325 DCHECK_EQ(state_, HEADER_OPEN) << "Header is already closed.";
326 contents_writer_->CloseContainer(attachment_writer_.get());
327 state_ = INITIALIZED;
328 }
329
330 bool IBusObjectWriter::AddAttachment(const std::string& key,
331 const base::Value& value) {
332 DCHECK_NE(state_, NOT_INITIALZED) << "Do not call before Init();";
333 DCHECK_NE(state_, INITIALIZED) << "Do not call after CloseHeader().";
334 DCHECK(attachment_writer_.get());
335 DCHECK(!key.empty());
336 DCHECK(!value.IsType(base::Value::TYPE_NULL));
337
338 dbus::MessageWriter dict_writer(NULL);
339 attachment_writer_->OpenDictEntry(&dict_writer);
340 dict_writer.AppendString(key);
341 dbus::MessageWriter variant_writer(NULL);
342 dict_writer.OpenVariant("v", &variant_writer);
343
344 dbus::AppendBasicTypeValueDataAsVariant(&variant_writer, value);
345 dict_writer.CloseContainer(&variant_writer);
346 attachment_writer_->CloseContainer(&variant_writer);
347 return true;
293 } 348 }
294 349
295 } // namespace ibus 350 } // namespace ibus
296 } // namespace chromeos 351 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698