| Index: chromeos/dbus/ibus/ibus_object.h | 
| diff --git a/chromeos/dbus/ibus/ibus_object.h b/chromeos/dbus/ibus/ibus_object.h | 
| index b6cf45cf8d007024355b559ba5548e57efdb3fed..66defa6220cf371fd64ab91a1e19e4ee16fcfdca 100644 | 
| --- a/chromeos/dbus/ibus/ibus_object.h | 
| +++ b/chromeos/dbus/ibus/ibus_object.h | 
| @@ -5,17 +5,23 @@ | 
| #ifndef CHROMEOS_DBUS_IBUS_IBUS_OBJECT_H_ | 
| #define CHROMEOS_DBUS_IBUS_IBUS_OBJECT_H_ | 
|  | 
| +#include <map> | 
| #include <string> | 
| + | 
| #include "base/basictypes.h" | 
| #include "base/memory/scoped_ptr.h" | 
| #include "chromeos/chromeos_export.h" | 
| #include "chromeos/dbus/ibus/ibus_property.h" | 
| #include "chromeos/dbus/ibus/ibus_text.h" | 
|  | 
| +namespace base { | 
| +class Value; | 
| +}  // namespace base | 
| + | 
| namespace dbus { | 
| class MessageReader; | 
| class MessageWriter; | 
| -}  // dbus | 
| +}  // namespace dbus | 
|  | 
| namespace chromeos { | 
| // TODO(nona): Remove ibus namespace after complete libibus removal. | 
| @@ -75,6 +81,12 @@ namespace ibus { | 
| //   // Craetes reader for IBusText | 
| //   IBusObjectReader object_reader("IBusText", &reader); | 
| // | 
| +//   // Initialize for reading attachment field. | 
| +//   object_reader.Init(); | 
| +// | 
| +//   // Get attachment field. | 
| +//   base::Value* value = object_reader.GetAttachment("annotation"); | 
| +// | 
| //   std::string text; | 
| //   reader.PopString(&text);  // Reading 1st value as string. | 
| // | 
| @@ -93,10 +105,6 @@ class CHROMEOS_EXPORT IBusObjectReader { | 
| // to read attachment field. | 
| bool Init(); | 
|  | 
| -  // Reads IBusObject headers and checks if the type name is valid. | 
| -  // Returns true and sets up reader for attachment reading on success. | 
| -  bool InitWithAttachmentReader(dbus::MessageReader* reader); | 
| - | 
| // Reads IBusOBject with |reader| and checks if the type name is valid. | 
| bool InitWithParentReader(dbus::MessageReader* reader); | 
|  | 
| @@ -129,6 +137,10 @@ class CHROMEOS_EXPORT IBusObjectReader { | 
| // Pops a IBusPropertyList. | 
| bool PopIBusPropertyList(ibus::IBusPropertyList* property_list); | 
|  | 
| +  // Gets attachment entry corresponding to |key|. Do not free returned value. | 
| +  // Returns NULL if there is no entry. | 
| +  const base::Value* GetAttachment(const std::string& key); | 
| + | 
| private: | 
| enum CheckResult { | 
| IBUS_OBJECT_VALID,  // Already checked and valid type. | 
| @@ -136,15 +148,12 @@ class CHROMEOS_EXPORT IBusObjectReader { | 
| IBUS_OBJECT_NOT_CHECKED,  // Not checked yet. | 
| }; | 
|  | 
| -  // Reads IBusObject headers without attachment and checks if the type name | 
| -  // is valid. | 
| -  bool InitWithoutAttachment(); | 
| - | 
| std::string type_name_; | 
| dbus::MessageReader* original_reader_; | 
| scoped_ptr<dbus::MessageReader> top_variant_reader_; | 
| scoped_ptr<dbus::MessageReader> contents_reader_; | 
| CheckResult check_result_; | 
| +  std::map<std::string, base::Value*> attachments_; | 
|  | 
| DISALLOW_COPY_AND_ASSIGN(IBusObjectReader); | 
| }; | 
| @@ -158,6 +167,13 @@ class CHROMEOS_EXPORT IBusObjectReader { | 
| //   // Creates writer for IBusText | 
| //   IBusObjectWriter object_writer("IBusText", "sv", &writer); | 
| // | 
| +//   // Add some attachments. | 
| +//   base::Value* value = base::Value::CreateStringValue("Noun"); | 
| +//   object_writer.AddAttachment("annotation", *value); | 
| +// | 
| +//   // Close header section. | 
| +//   object_writer.CloseHeader(); | 
| +// | 
| //   const std::string text = "Sample Text"; | 
| //   writer.AppendString(text); | 
| // | 
| @@ -170,15 +186,28 @@ class CHROMEOS_EXPORT IBusObjectReader { | 
| //   object_writer.CloseAll(); | 
| class CHROMEOS_EXPORT IBusObjectWriter { | 
| public: | 
| +  enum WriterState { | 
| +    NOT_INITIALZED,  // Created but not initialized. | 
| +    HEADER_OPEN,  // Ready for writing attachment field. | 
| +    INITIALIZED  // Ready for writing content values. | 
| +  }; | 
| + | 
| // |writer| must be released by caller. | 
| IBusObjectWriter(const std::string& type_name, | 
| const std::string& signature, | 
| dbus::MessageWriter* writer); | 
| virtual ~IBusObjectWriter(); | 
|  | 
| +  // Closes header to write content values. | 
| +  void CloseHeader(); | 
| + | 
| // Appends IBusObject headers with |writer|, should be called once. | 
| void InitWithParentWriter(dbus::MessageWriter* writer); | 
|  | 
| +  // Adds an attachment, this function can be called only before CloseHeader | 
| +  // function call. | 
| +  bool AddAttachment(const std::string& key, const base::Value& value); | 
| + | 
| // The following functions delegate dbus::MessageReader's functions. | 
| void AppendString(const std::string& input); | 
| void AppendUint32(uint32 value); | 
| @@ -194,9 +223,6 @@ class CHROMEOS_EXPORT IBusObjectWriter { | 
| // Closes all opened containers. | 
| void CloseAll(); | 
|  | 
| -  // Returns true if writer is initialized. | 
| -  bool IsInitialized() const; | 
| - | 
| // Appends a IBusText. | 
| void AppendIBusText(const ibus::IBusText& text); | 
|  | 
| @@ -217,8 +243,10 @@ class CHROMEOS_EXPORT IBusObjectWriter { | 
| std::string type_name_; | 
| std::string signature_; | 
| dbus::MessageWriter* original_writer_; | 
| +  WriterState state_; | 
| scoped_ptr<dbus::MessageWriter> top_variant_writer_; | 
| scoped_ptr<dbus::MessageWriter> contents_writer_; | 
| +  scoped_ptr<dbus::MessageWriter> attachment_writer_; | 
|  | 
| DISALLOW_COPY_AND_ASSIGN(IBusObjectWriter); | 
| }; | 
|  |