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

Unified Diff: chromeos/dbus/ibus/ibus_lookup_table.cc

Issue 10392039: Implement IBusLookupTable. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Rebase Created 8 years, 7 months 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 side-by-side diff with in-line comments
Download patch
Index: chromeos/dbus/ibus/ibus_lookup_table.cc
diff --git a/chromeos/dbus/ibus/ibus_lookup_table.cc b/chromeos/dbus/ibus/ibus_lookup_table.cc
new file mode 100644
index 0000000000000000000000000000000000000000..eb80410979b4d8038d84eb47029bde98df9f153c
--- /dev/null
+++ b/chromeos/dbus/ibus/ibus_lookup_table.cc
@@ -0,0 +1,165 @@
+// Copyright (c) 2012 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/dbus/ibus/ibus_lookup_table.h"
+
+#include <string>
+#include "base/logging.h"
+#include "dbus/message.h"
+#include "chromeos/dbus/ibus/ibus_text.h"
+#include "chromeos/dbus/ibus/ibus_object.h"
+
+namespace chromeos {
+// TODO(nona): Remove ibus namespace after complete libibus removal.
+namespace ibus {
+
+void AppendIBusLookupTable(const IBusLookupTable& table,
+ dbus::MessageWriter* writer) {
+ IBusObjectWriter ibus_lookup_table_writer("IBusLookupTable",
+ "uubbiavav",
+ writer);
+ ibus_lookup_table_writer.AppendUint32(table.page_size());
+ ibus_lookup_table_writer.AppendUint32(table.cursor_position());
+ ibus_lookup_table_writer.AppendBool(table.is_cursor_visible());
+ ibus_lookup_table_writer.AppendBool(false); // Not used in Chrome.
+ ibus_lookup_table_writer.AppendInt32(static_cast<int32>(table.orientation()));
+
+ const std::vector<IBusLookupTable::Entry>& candidates = table.candidates();
+ dbus::MessageWriter text_writer(NULL);
+ ibus_lookup_table_writer.OpenArray("v", &text_writer);
+ bool have_labels = false;
+ for (size_t i = 0; i < candidates.size(); ++i) {
+ // Write candidate string as IBusText.
+ AppendStringAsIBusText(candidates[i].value, &text_writer);
+ if (!candidates[i].label.empty())
+ have_labels = true;
+ }
+ ibus_lookup_table_writer.CloseContainer(&text_writer);
+
+ dbus::MessageWriter label_writer(NULL);
+ ibus_lookup_table_writer.OpenArray("v", &label_writer);
+
+ // If there are not any labels, don't append labels.
+ if (have_labels) {
+ for (size_t i = 0; i < candidates.size(); ++i) {
+ // Write label string as IBusText.
+ AppendStringAsIBusText(candidates[i].label, &label_writer);
+ }
+ }
+ ibus_lookup_table_writer.CloseContainer(&label_writer);
+
+ ibus_lookup_table_writer.CloseAll();
+}
+
+bool PopIBusLookupTable(dbus::MessageReader* reader, IBusLookupTable* table) {
+ IBusObjectReader ibus_object_reader("IBusLookupTable", reader);
+ if (!ibus_object_reader.Init())
+ return false;
+
+ uint32 page_size = 0;
+ if (!ibus_object_reader.PopUint32(&page_size)) {
+ LOG(ERROR) << "Invalid variant structure[IBusLookupTable]: "
+ << "1st argument should be uint32.";
+ return false;
+ }
+ table->set_page_size(page_size);
+
+ uint32 cursor_position = 0;
+ if (!ibus_object_reader.PopUint32(&cursor_position)) {
+ LOG(ERROR) << "Invalid variant structure[IBusLookupTable]: "
+ << "2nd argument should be uint32.";
+ return false;
+ }
+ table->set_cursor_position(cursor_position);
+
+ bool cursor_visible = true;
+ if (!ibus_object_reader.PopBool(&cursor_visible)) {
+ LOG(ERROR) << "Invalid variant structure[IBusLookupTable]: "
+ << "3rd arugment should be boolean.";
+ return false;
+ }
+ table->set_is_cursor_visible(cursor_visible);
+
+ bool unused_round_value = true;
+ if (!ibus_object_reader.PopBool(&unused_round_value)) {
+ LOG(ERROR) << "Invalid variant structure[IBusLookupTable]: "
+ << "4th argument should be boolean.";
+ return false;
+ }
+
+ int32 orientation = 0;
+ if (!ibus_object_reader.PopInt32(&orientation)) {
+ LOG(ERROR) << "Invalid variant structure[IBusLookupTable]: "
+ << "5th arguemnt should be int32.";
+ return false;
+ }
+ table->set_orientation(
+ static_cast<IBusLookupTable::Orientation>(orientation));
+
+ dbus::MessageReader text_array_reader(NULL);
+ if (!ibus_object_reader.PopArray(&text_array_reader)) {
+ LOG(ERROR) << "Invalid variant structure[IBusLookupTable]: "
+ << "6th argument should be array.";
+ return false;
+ }
+
+ std::vector<IBusLookupTable::Entry>* candidates = table->mutable_candidates();
+ while (text_array_reader.HasMoreData()) {
+ std::string candidate_text;
+ // The attributes in IBusText are not used in Chrome.
+ if (!PopStringFromIBusText(&text_array_reader, &candidate_text)) {
+ LOG(ERROR) << "Invalid variant structure[IBusLookupTable]: "
+ << "6th argument should be array of IBusText.";
+ return false;
+ }
+ IBusLookupTable::Entry entry;
+ entry.value = candidate_text;
+ candidates->push_back(entry);
+ }
+
+ dbus::MessageReader label_array_reader(NULL);
+ if (!ibus_object_reader.PopArray(&label_array_reader)) {
+ LOG(ERROR) << "Invalid variant structure[IBusLookupTable]: "
+ << "7th argument should be array.";
+ return false;
+ }
+
+ if (!label_array_reader.HasMoreData()) {
+ return true;
+ }
+
+ for (size_t i = 0; i < candidates->size(); ++i) {
+ if (!label_array_reader.HasMoreData()) {
+ LOG(ERROR) << "Invalid variant structure[IBusLookupTable]: "
+ << "The number of label entry does not match with candidate "
+ << "text. Same length or no label entry can be accepted.";
+ return false;
+ }
+
+ std::string label_text;
+ // The attributes in IBusText are not used in Chrome.
+ if (!PopStringFromIBusText(&label_array_reader, &label_text)) {
+ LOG(ERROR) << "Invalid variant structure[IBusLookupTable]: "
+ << "7th argument should be array of IBusText.";
+ return false;
+ }
+ (*candidates)[i].label = label_text;
+ }
+ return true;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// IBusLookupTable
+IBusLookupTable::IBusLookupTable()
+ : page_size_(0),
+ cursor_position_(0),
+ is_cursor_visible_(true),
+ orientation_(IBUS_LOOKUP_TABLE_ORIENTATION_HORIZONTAL) {
+}
+
+IBusLookupTable::~IBusLookupTable() {
+}
+
+} // namespace ibus
+} // namespace chromeos

Powered by Google App Engine
This is Rietveld 408576698