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

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

Issue 11361210: Extends IBusObject to handle attachment field. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix include order 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
« no previous file with comments | « chromeos/dbus/ibus/ibus_property.cc ('k') | chromeos/dbus/ibus/ibus_text_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_text.h" 5 #include "chromeos/dbus/ibus/ibus_text.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/values.h"
8 #include "chromeos/dbus/ibus/ibus_object.h" 9 #include "chromeos/dbus/ibus/ibus_object.h"
9 #include "dbus/message.h" 10 #include "dbus/message.h"
10 11
11 namespace chromeos { 12 namespace chromeos {
12 // TODO(nona): Remove ibus namespace after complete libibus removal. 13 // TODO(nona): Remove ibus namespace after complete libibus removal.
13 namespace ibus { 14 namespace ibus {
14 15
15 namespace { 16 namespace {
16 const uint32 kAttributeUnderline = 1; // Indicates underline attribute. 17 const uint32 kAttributeUnderline = 1; // Indicates underline attribute.
17 const uint32 kAttributeSelection = 2; // Indicates background attribute. 18 const uint32 kAttributeSelection = 2; // Indicates background attribute.
19 const char kAnnotationKey[] = "annotation";
20 const char kDescriptionKey[] = "description";
18 21
19 struct IBusAttribute { 22 struct IBusAttribute {
20 IBusAttribute() : type(0), value(0), start_index(0), end_index(0) {} 23 IBusAttribute() : type(0), value(0), start_index(0), end_index(0) {}
21 uint32 type; 24 uint32 type;
22 uint32 value; 25 uint32 value;
23 uint32 start_index; 26 uint32 start_index;
24 uint32 end_index; 27 uint32 end_index;
25 }; 28 };
26 29
27 // Pops a IBusAttribute from |reader|. 30 // Pops a IBusAttribute from |reader|.
(...skipping 11 matching lines...) Expand all
39 << "IBusAttribute should contain 4 unsigned integers."; 42 << "IBusAttribute should contain 4 unsigned integers.";
40 return false; 43 return false;
41 } 44 }
42 return true; 45 return true;
43 } 46 }
44 47
45 // Appends a IBusAttribute into |writer|. 48 // Appends a IBusAttribute into |writer|.
46 void AppendIBusAttribute(dbus::MessageWriter* writer, 49 void AppendIBusAttribute(dbus::MessageWriter* writer,
47 const IBusAttribute& attribute) { 50 const IBusAttribute& attribute) {
48 IBusObjectWriter ibus_attribute_writer("IBusAttribute", "uuuu", writer); 51 IBusObjectWriter ibus_attribute_writer("IBusAttribute", "uuuu", writer);
52 ibus_attribute_writer.CloseHeader();
49 ibus_attribute_writer.AppendUint32(attribute.type); 53 ibus_attribute_writer.AppendUint32(attribute.type);
50 ibus_attribute_writer.AppendUint32(attribute.value); 54 ibus_attribute_writer.AppendUint32(attribute.value);
51 ibus_attribute_writer.AppendUint32(attribute.start_index); 55 ibus_attribute_writer.AppendUint32(attribute.start_index);
52 ibus_attribute_writer.AppendUint32(attribute.end_index); 56 ibus_attribute_writer.AppendUint32(attribute.end_index);
53 ibus_attribute_writer.CloseAll(); 57 ibus_attribute_writer.CloseAll();
54 } 58 }
55 59
56 } // namespace 60 } // namespace
57 61
58 void AppendIBusText(const IBusText& ibus_text, dbus::MessageWriter* writer) { 62 void AppendIBusText(const IBusText& ibus_text, dbus::MessageWriter* writer) {
59 IBusObjectWriter ibus_text_writer("IBusText", "sv", writer); 63 IBusObjectWriter ibus_text_writer("IBusText", "sv", writer);
60 64
65 if (!ibus_text.annotation().empty()) {
66 scoped_ptr<base::Value> annotation(
67 base::Value::CreateStringValue(ibus_text.annotation()));
68 ibus_text_writer.AddAttachment(kAnnotationKey, *annotation.get());
69 }
70
71 if (!ibus_text.description().empty()) {
72 scoped_ptr<base::Value> description(
73 base::Value::CreateStringValue(ibus_text.description()));
74 ibus_text_writer.AddAttachment(kDescriptionKey, *description.get());
75 }
76 ibus_text_writer.CloseHeader();
77
61 ibus_text_writer.AppendString(ibus_text.text()); 78 ibus_text_writer.AppendString(ibus_text.text());
62 79
63 // Start appending IBusAttrList into IBusText 80 // Start appending IBusAttrList into IBusText
64 IBusObjectWriter ibus_attr_list_writer("IBusAttrList", "av", NULL); 81 IBusObjectWriter ibus_attr_list_writer("IBusAttrList", "av", NULL);
65 ibus_text_writer.AppendIBusObject(&ibus_attr_list_writer); 82 ibus_text_writer.AppendIBusObject(&ibus_attr_list_writer);
83 ibus_attr_list_writer.CloseHeader();
66 dbus::MessageWriter attribute_array_writer(NULL); 84 dbus::MessageWriter attribute_array_writer(NULL);
67 ibus_attr_list_writer.OpenArray("v", &attribute_array_writer); 85 ibus_attr_list_writer.OpenArray("v", &attribute_array_writer);
68 86
69 const std::vector<IBusText::UnderlineAttribute>& underline_attributes = 87 const std::vector<IBusText::UnderlineAttribute>& underline_attributes =
70 ibus_text.underline_attributes(); 88 ibus_text.underline_attributes();
71 for (size_t i = 0; i < underline_attributes.size(); ++i) { 89 for (size_t i = 0; i < underline_attributes.size(); ++i) {
72 IBusAttribute attribute; 90 IBusAttribute attribute;
73 attribute.type = kAttributeUnderline; 91 attribute.type = kAttributeUnderline;
74 attribute.value = static_cast<uint32>(underline_attributes[i].type); 92 attribute.value = static_cast<uint32>(underline_attributes[i].type);
75 attribute.start_index = underline_attributes[i].start_index; 93 attribute.start_index = underline_attributes[i].start_index;
(...skipping 21 matching lines...) Expand all
97 void CHROMEOS_EXPORT AppendStringAsIBusText(const std::string& text, 115 void CHROMEOS_EXPORT AppendStringAsIBusText(const std::string& text,
98 dbus::MessageWriter* writer) { 116 dbus::MessageWriter* writer) {
99 IBusText ibus_text; 117 IBusText ibus_text;
100 ibus_text.set_text(text); 118 ibus_text.set_text(text);
101 AppendIBusText(ibus_text, writer); 119 AppendIBusText(ibus_text, writer);
102 } 120 }
103 121
104 bool PopIBusText(dbus::MessageReader* reader, IBusText* ibus_text) { 122 bool PopIBusText(dbus::MessageReader* reader, IBusText* ibus_text) {
105 IBusObjectReader ibus_text_reader("IBusText", reader); 123 IBusObjectReader ibus_text_reader("IBusText", reader);
106 124
107 dbus::MessageReader attachment_reader(NULL); 125 if (!ibus_text_reader.Init())
108 if (!ibus_text_reader.InitWithAttachmentReader(&attachment_reader))
109 return false; 126 return false;
110 127
111 while (attachment_reader.HasMoreData()) { 128 const base::Value* annotation_value =
112 dbus::MessageReader dictionary_reader(NULL); 129 ibus_text_reader.GetAttachment(kAnnotationKey);
113 if (!attachment_reader.PopDictEntry(&dictionary_reader)) { 130 if (annotation_value) {
114 LOG(ERROR) << "Invalid attachment structure: " 131 std::string annotation;
115 << "The attachment field is array of dictionary entry."; 132 if (annotation_value->GetAsString(&annotation))
116 return false; 133 ibus_text->set_annotation(annotation);
117 } 134 }
118 135
119 std::string key; 136 const base::Value* description_value =
120 if (!dictionary_reader.PopString(&key)) { 137 ibus_text_reader.GetAttachment(kDescriptionKey);
121 LOG(ERROR) << "Invalid attachement structure: " 138 if (description_value) {
122 << "The 1st dictionary entry should be string."; 139 std::string description;
123 return false; 140 if (description_value->GetAsString(&description))
124 } 141 ibus_text->set_description(description);
125
126 dbus::MessageReader variant_reader(NULL);
127 if (!dictionary_reader.PopVariant(&variant_reader)) {
128 LOG(ERROR) << "Invalid attachment structure: "
129 << "The 2nd dictionary entry shuold be variant.";
130 return false;
131 }
132
133 dbus::MessageReader sub_variant_reader(NULL);
134 if (!variant_reader.PopVariant(&sub_variant_reader)) {
135 LOG(ERROR) << "Invalid attachment structure: "
136 << "The 2nd variant entry should contain variant.";
137 return false;
138 }
139
140 std::string value;
141 if (!sub_variant_reader.PopString(&value))
142 continue; // Ignore other attachment values.
143
144 if (key == "annotation")
145 ibus_text->set_annotation(value);
146 else if (key == "description")
147 ibus_text->set_description(value);
148 else
149 continue; // Ignore other fields.
150 } 142 }
151 143
152 std::string text; 144 std::string text;
153 if (!ibus_text_reader.PopString(&text)) { 145 if (!ibus_text_reader.PopString(&text)) {
154 LOG(ERROR) << "Invalid variant structure[IBusText]: " 146 LOG(ERROR) << "Invalid variant structure[IBusText]: "
155 << "1st argument should be string."; 147 << "1st argument should be string.";
156 return false; 148 return false;
157 } 149 }
158 150
159 ibus_text->set_text(text); 151 ibus_text->set_text(text);
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 // IBusText 209 // IBusText
218 IBusText::IBusText() 210 IBusText::IBusText()
219 : text_("") { 211 : text_("") {
220 } 212 }
221 213
222 IBusText::~IBusText() { 214 IBusText::~IBusText() {
223 } 215 }
224 216
225 } // namespace ibus 217 } // namespace ibus
226 } // namespace chromeos 218 } // namespace chromeos
OLDNEW
« no previous file with comments | « chromeos/dbus/ibus/ibus_property.cc ('k') | chromeos/dbus/ibus/ibus_text_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698