1ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// Use of this source code is governed by a BSD-style license that can be
3ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// found in the LICENSE file.
4ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
5ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#ifndef DBUS_MESSAGE_H_
6ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#define DBUS_MESSAGE_H_
7ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
8cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include <dbus/dbus.h>
9cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include <stddef.h>
10cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include <stdint.h>
11ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include <string>
12ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include <vector>
13ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
14cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include "base/macros.h"
15ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include "base/memory/scoped_ptr.h"
16ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include "dbus/dbus_export.h"
17ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include "dbus/file_descriptor.h"
18ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include "dbus/object_path.h"
19ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
20ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratnamespace google {
21ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratnamespace protobuf {
22ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
23ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratclass MessageLite;
24ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
25ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat}  // namespace protobuf
26ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat}  // namespace google
27ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
28ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
29ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratnamespace dbus {
30ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
31ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratclass MessageWriter;
32ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratclass MessageReader;
33ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
34ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// DBUS_TYPE_UNIX_FD was added in D-Bus version 1.4
35ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#if !defined(DBUS_TYPE_UNIX_FD)
36ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#define DBUS_TYPE_UNIX_FD      ((int) 'h')
37ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#endif
38ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
39ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// Returns true if Unix FD passing is supported in libdbus.
40ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// The check is done runtime rather than compile time as the libdbus
41ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// version used at runtime may be different from the one used at compile time.
42ae6a045d2239408e25198ad17e2413bdde105788Daniel EratCHROME_DBUS_EXPORT bool IsDBusTypeUnixFdSupported();
43ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
44ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// Message is the base class of D-Bus message types. Client code must use
45ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// sub classes such as MethodCall and Response instead.
46ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
47ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// The class name Message is very generic, but there should be no problem
48ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// as the class is inside 'dbus' namespace. We chose to name this way, as
49ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// libdbus defines lots of types starting with DBus, such as
50ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// DBusMessage. We should avoid confusion and conflict with these types.
51ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratclass CHROME_DBUS_EXPORT Message {
52ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat public:
53ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // The message type used in D-Bus.  Redefined here so client code
54ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // doesn't need to use raw D-Bus macros. DBUS_MESSAGE_TYPE_INVALID
55ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // etc. are #define macros. Having an enum type here makes code a bit
56ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // more type-safe.
57ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  enum MessageType {
58ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    MESSAGE_INVALID = DBUS_MESSAGE_TYPE_INVALID,
59ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    MESSAGE_METHOD_CALL = DBUS_MESSAGE_TYPE_METHOD_CALL,
60ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    MESSAGE_METHOD_RETURN = DBUS_MESSAGE_TYPE_METHOD_RETURN,
61ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    MESSAGE_SIGNAL = DBUS_MESSAGE_TYPE_SIGNAL,
62ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    MESSAGE_ERROR = DBUS_MESSAGE_TYPE_ERROR,
63ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat };
64ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
65ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // The data type used in the D-Bus type system.  See the comment at
66ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // MessageType for why we are redefining data types here.
67ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  enum DataType {
68ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    INVALID_DATA = DBUS_TYPE_INVALID,
69ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    BYTE = DBUS_TYPE_BYTE,
70ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    BOOL = DBUS_TYPE_BOOLEAN,
71ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    INT16 = DBUS_TYPE_INT16,
72ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    UINT16 = DBUS_TYPE_UINT16,
73ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    INT32 = DBUS_TYPE_INT32,
74ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    UINT32 = DBUS_TYPE_UINT32,
75ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    INT64 = DBUS_TYPE_INT64,
76ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    UINT64 = DBUS_TYPE_UINT64,
77ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    DOUBLE = DBUS_TYPE_DOUBLE,
78ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    STRING = DBUS_TYPE_STRING,
79ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    OBJECT_PATH = DBUS_TYPE_OBJECT_PATH,
80ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    ARRAY = DBUS_TYPE_ARRAY,
81ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    STRUCT = DBUS_TYPE_STRUCT,
82ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    DICT_ENTRY = DBUS_TYPE_DICT_ENTRY,
83ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    VARIANT = DBUS_TYPE_VARIANT,
84ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    UNIX_FD = DBUS_TYPE_UNIX_FD,
85ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  };
86ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
87ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns the type of the message. Returns MESSAGE_INVALID if
88ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // raw_message_ is NULL.
89ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  MessageType GetMessageType();
90ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
91ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns the type of the message as string like "MESSAGE_METHOD_CALL"
92ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // for instance.
93ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  std::string GetMessageTypeAsString();
94ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
95ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  DBusMessage* raw_message() { return raw_message_; }
96ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
97ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Sets the destination, the path, the interface, the member, etc.
98ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool SetDestination(const std::string& destination);
99ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool SetPath(const ObjectPath& path);
100ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool SetInterface(const std::string& interface);
101ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool SetMember(const std::string& member);
102ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool SetErrorName(const std::string& error_name);
103ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool SetSender(const std::string& sender);
104cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  void SetSerial(uint32_t serial);
105cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  void SetReplySerial(uint32_t reply_serial);
106ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // SetSignature() does not exist as we cannot do it.
107ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
108ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Gets the destination, the path, the interface, the member, etc.
109ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // If not set, an empty string is returned.
110ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  std::string GetDestination();
111ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  ObjectPath GetPath();
112ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  std::string GetInterface();
113ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  std::string GetMember();
114ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  std::string GetErrorName();
115ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  std::string GetSender();
116ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  std::string GetSignature();
117ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Gets the serial and reply serial numbers. Returns 0 if not set.
118cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  uint32_t GetSerial();
119cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  uint32_t GetReplySerial();
120ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
121ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns the string representation of this message. Useful for
122ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // debugging. The output is truncated as needed (ex. strings are truncated
123ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // if longer than a certain limit defined in the .cc file).
124ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  std::string ToString();
125ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
126ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat protected:
127ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // This class cannot be instantiated. Use sub classes instead.
128ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  Message();
129ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual ~Message();
130ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
131ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Initializes the message with the given raw message.
132ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void Init(DBusMessage* raw_message);
133ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
134ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat private:
135ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Helper function used in ToString().
136ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  std::string ToStringInternal(const std::string& indent,
137ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                               MessageReader* reader);
138ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
139ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  DBusMessage* raw_message_;
140ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  DISALLOW_COPY_AND_ASSIGN(Message);
141ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat};
142ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
143ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// MessageCall is a type of message used for calling a method via D-Bus.
144ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratclass CHROME_DBUS_EXPORT MethodCall : public Message {
145ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat public:
146ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Creates a method call message for the specified interface name and
147ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // the method name.
148ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
149ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // For instance, to call "Get" method of DBUS_INTERFACE_INTROSPECTABLE
150ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // interface ("org.freedesktop.DBus.Introspectable"), create a method
151ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // call like this:
152ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
153ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //   MethodCall method_call(DBUS_INTERFACE_INTROSPECTABLE, "Get");
154ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
155ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // The constructor creates the internal raw message.
156ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  MethodCall(const std::string& interface_name,
157ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat             const std::string& method_name);
158ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
159ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns a newly created MethodCall from the given raw message of the
160ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // type DBUS_MESSAGE_TYPE_METHOD_CALL. The caller must delete the
161ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // returned object. Takes the ownership of |raw_message|.
162ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  static MethodCall* FromRawMessage(DBusMessage* raw_message);
163ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
164ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat private:
165ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Creates a method call message. The internal raw message is NULL.
166ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Only used internally.
167ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  MethodCall();
168ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
169ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  DISALLOW_COPY_AND_ASSIGN(MethodCall);
170ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat};
171ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
172ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// Signal is a type of message used to send a signal.
173ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratclass CHROME_DBUS_EXPORT Signal : public Message {
174ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat public:
175ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Creates a signal message for the specified interface name and the
176ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // method name.
177ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
178ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // For instance, to send "PropertiesChanged" signal of
179ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // DBUS_INTERFACE_INTROSPECTABLE interface
180ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // ("org.freedesktop.DBus.Introspectable"), create a signal like this:
181ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
182ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //   Signal signal(DBUS_INTERFACE_INTROSPECTABLE, "PropertiesChanged");
183ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
184ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // The constructor creates the internal raw_message_.
185ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  Signal(const std::string& interface_name,
186ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat         const std::string& method_name);
187ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
188ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns a newly created SIGNAL from the given raw message of the type
189ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // DBUS_MESSAGE_TYPE_SIGNAL. The caller must delete the returned
190ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // object. Takes the ownership of |raw_message|.
191ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  static Signal* FromRawMessage(DBusMessage* raw_message);
192ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
193ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat private:
194ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Creates a signal message. The internal raw message is NULL.
195ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Only used internally.
196ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  Signal();
197ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
198ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  DISALLOW_COPY_AND_ASSIGN(Signal);
199ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat};
200ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
201ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// Response is a type of message used for receiving a response from a
202ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// method via D-Bus.
203ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratclass CHROME_DBUS_EXPORT Response : public Message {
204ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat public:
205ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns a newly created Response from the given raw message of the
206ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // type DBUS_MESSAGE_TYPE_METHOD_RETURN. Takes the ownership of |raw_message|.
207ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  static scoped_ptr<Response> FromRawMessage(DBusMessage* raw_message);
208ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
209ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns a newly created Response from the given method call.
210ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Used for implementing exported methods. Does NOT take the ownership of
211ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // |method_call|.
212ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  static scoped_ptr<Response> FromMethodCall(MethodCall* method_call);
213ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
214ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns a newly created Response with an empty payload.
215ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Useful for testing.
216ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  static scoped_ptr<Response> CreateEmpty();
217ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
218ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat protected:
219ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Creates a Response message. The internal raw message is NULL.
220ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  Response();
221ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
222ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat private:
223ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  DISALLOW_COPY_AND_ASSIGN(Response);
224ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat};
225ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
226ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// ErrorResponse is a type of message used to return an error to the
227ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// caller of a method.
228ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratclass CHROME_DBUS_EXPORT ErrorResponse: public Response {
229ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat public:
230ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns a newly created Response from the given raw message of the
231ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // type DBUS_MESSAGE_TYPE_METHOD_RETURN. Takes the ownership of |raw_message|.
232ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  static scoped_ptr<ErrorResponse> FromRawMessage(DBusMessage* raw_message);
233ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
234ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns a newly created ErrorResponse from the given method call, the
235ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // error name, and the error message.  The error name looks like
236ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // "org.freedesktop.DBus.Error.Failed". Used for returning an error to a
237ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // failed method call. Does NOT take the ownership of |method_call|.
238ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  static scoped_ptr<ErrorResponse> FromMethodCall(
239ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      MethodCall* method_call,
240ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      const std::string& error_name,
241ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      const std::string& error_message);
242ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
243ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat private:
244ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Creates an ErrorResponse message. The internal raw message is NULL.
245ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  ErrorResponse();
246ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
247ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  DISALLOW_COPY_AND_ASSIGN(ErrorResponse);
248ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat};
249ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
250ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// MessageWriter is used to write outgoing messages for calling methods
251ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// and sending signals.
252ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
253ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// The main design goal of MessageReader and MessageWriter classes is to
254ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// provide a type safe API. In the past, there was a Chrome OS blocker
255ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// bug, that took days to fix, that would have been prevented if the API
256ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// was type-safe.
257ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
258ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// For instance, instead of doing something like:
259ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
260ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//   // We shouldn't add '&' to str here, but it compiles with '&' added.
261ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//   dbus_g_proxy_call(..., G_TYPE_STRING, str, G_TYPE_INVALID, ...)
262ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
263ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// We want to do something like:
264ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
265ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//   writer.AppendString(str);
266ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
267ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratclass CHROME_DBUS_EXPORT MessageWriter {
268ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat public:
269ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Data added with Append* will be written to |message|, which may be NULL
270ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // to create a sub-writer for passing to OpenArray, etc.
271ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  explicit MessageWriter(Message* message);
272ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  ~MessageWriter();
273ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
274ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Appends a byte to the message.
275cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  void AppendByte(uint8_t value);
276ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void AppendBool(bool value);
277cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  void AppendInt16(int16_t value);
278cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  void AppendUint16(uint16_t value);
279cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  void AppendInt32(int32_t value);
280cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  void AppendUint32(uint32_t value);
281cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  void AppendInt64(int64_t value);
282cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  void AppendUint64(uint64_t value);
283ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void AppendDouble(double value);
284ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void AppendString(const std::string& value);
285ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void AppendObjectPath(const ObjectPath& value);
286ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void AppendFileDescriptor(const FileDescriptor& value);
287ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
288ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Opens an array. The array contents can be added to the array with
289ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // |sub_writer|. The client code must close the array with
290ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // CloseContainer(), once all contents are added.
291ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
292ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // |signature| parameter is used to supply the D-Bus type signature of
293ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // the array contents. For instance, if you want an array of strings,
294ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // then you pass "s" as the signature.
295ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
296ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // See the spec for details about the type signatures.
297ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // http://dbus.freedesktop.org/doc/dbus-specification.html
298ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // #message-protocol-signatures
299ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
300ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void OpenArray(const std::string& signature, MessageWriter* sub_writer);
301ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Do the same for a variant.
302ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void OpenVariant(const std::string& signature, MessageWriter* sub_writer);
303ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Do the same for Struct and dict entry. They don't need the signature.
304ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void OpenStruct(MessageWriter* sub_writer);
305ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void OpenDictEntry(MessageWriter* sub_writer);
306ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
307ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Close the container for a array/variant/struct/dict entry.
308ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void CloseContainer(MessageWriter* sub_writer);
309ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
310ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Appends the array of bytes. Arrays of bytes are often used for
311ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // exchanging binary blobs hence it's worth having a specialized
312ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // function.
313cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  void AppendArrayOfBytes(const uint8_t* values, size_t length);
314ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
315ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Appends the array of strings. Arrays of strings are often used for
316ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // exchanging lists of names hence it's worth having a specialized
317ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // function.
318ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void AppendArrayOfStrings(const std::vector<std::string>& strings);
319ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
320ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Appends the array of object paths. Arrays of object paths are often
321ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // used when exchanging object paths, hence it's worth having a
322ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // specialized function.
323ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void AppendArrayOfObjectPaths(const std::vector<ObjectPath>& object_paths);
324ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
325ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Appends the protocol buffer as an array of bytes. The buffer is serialized
326ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // into an array of bytes before communication, since protocol buffers are not
327ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // a native dbus type. On the receiving size the array of bytes needs to be
328ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // read and deserialized into a protocol buffer of the correct type. There are
329ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // methods in MessageReader to assist in this.  Return true on succes and fail
330ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // when serialization is not successful.
331ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool AppendProtoAsArrayOfBytes(const google::protobuf::MessageLite& protobuf);
332ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
333ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Appends the byte wrapped in a variant data container. Variants are
334ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // widely used in D-Bus services so it's worth having a specialized
335ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // function. For instance, The third parameter of
336ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // "org.freedesktop.DBus.Properties.Set" is a variant.
337cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  void AppendVariantOfByte(uint8_t value);
338ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void AppendVariantOfBool(bool value);
339cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  void AppendVariantOfInt16(int16_t value);
340cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  void AppendVariantOfUint16(uint16_t value);
341cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  void AppendVariantOfInt32(int32_t value);
342cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  void AppendVariantOfUint32(uint32_t value);
343cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  void AppendVariantOfInt64(int64_t value);
344cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  void AppendVariantOfUint64(uint64_t value);
345ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void AppendVariantOfDouble(double value);
346ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void AppendVariantOfString(const std::string& value);
347ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void AppendVariantOfObjectPath(const ObjectPath& value);
348ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
349ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat private:
350ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Helper function used to implement AppendByte etc.
351ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void AppendBasic(int dbus_type, const void* value);
352ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
353ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Helper function used to implement AppendVariantOfByte() etc.
354ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void AppendVariantOfBasic(int dbus_type, const void* value);
355ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
356ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  Message* message_;
357ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  DBusMessageIter raw_message_iter_;
358ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool container_is_open_;
359ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
360ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  DISALLOW_COPY_AND_ASSIGN(MessageWriter);
361ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat};
362ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
363ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// MessageReader is used to read incoming messages such as responses for
364ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// method calls.
365ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
366ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// MessageReader manages an internal iterator to read data. All functions
367ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// starting with Pop advance the iterator on success.
368ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratclass CHROME_DBUS_EXPORT MessageReader {
369ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat public:
370ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // The data will be read from the given |message|, which may be NULL to
371ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // create a sub-reader for passing to PopArray, etc.
372ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  explicit MessageReader(Message* message);
373ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  ~MessageReader();
374ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
375ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns true if the reader has more data to read. The function is
376ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // used to iterate contents in a container like:
377ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
378ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //   while (reader.HasMoreData())
379ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //     reader.PopString(&value);
380ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool HasMoreData();
381ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
382ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Gets the byte at the current iterator position.
383ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns true and advances the iterator on success.
384ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns false if the data type is not a byte.
385cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  bool PopByte(uint8_t* value);
386ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool PopBool(bool* value);
387cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  bool PopInt16(int16_t* value);
388cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  bool PopUint16(uint16_t* value);
389cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  bool PopInt32(int32_t* value);
390cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  bool PopUint32(uint32_t* value);
391cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  bool PopInt64(int64_t* value);
392cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  bool PopUint64(uint64_t* value);
393ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool PopDouble(double* value);
394ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool PopString(std::string* value);
395ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool PopObjectPath(ObjectPath* value);
396ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool PopFileDescriptor(FileDescriptor* value);
397ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
398ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Sets up the given message reader to read an array at the current
399ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // iterator position.
400ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns true and advances the iterator on success.
401ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns false if the data type is not an array
402ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool PopArray(MessageReader* sub_reader);
403ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool PopStruct(MessageReader* sub_reader);
404ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool PopDictEntry(MessageReader* sub_reader);
405ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool PopVariant(MessageReader* sub_reader);
406ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
407ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Gets the array of bytes at the current iterator position.
408ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns true and advances the iterator on success.
409ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
410ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Arrays of bytes are often used for exchanging binary blobs hence it's
411ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // worth having a specialized function.
412ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
413ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Ownership of the memory pointed to by |bytes| remains with the
414ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // MessageReader; |bytes| must be copied if the contents will be referenced
415ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // after the MessageReader is destroyed.
416cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  bool PopArrayOfBytes(const uint8_t** bytes, size_t* length);
417ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
418ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Gets the array of strings at the current iterator position. |strings| is
419ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // cleared before being modified. Returns true and advances the iterator on
420ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // success.
421ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
422ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Arrays of strings are often used to communicate with D-Bus
423ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // services like KWallet, hence it's worth having a specialized
424ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // function.
425ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool PopArrayOfStrings(std::vector<std::string>* strings);
426ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
427ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Gets the array of object paths at the current iterator position.
428ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // |object_paths| is cleared before being modified. Returns true and advances
429ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // the iterator on success.
430ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
431ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Arrays of object paths are often used to communicate with D-Bus
432ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // services like NetworkManager, hence it's worth having a specialized
433ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // function.
434ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool PopArrayOfObjectPaths(std::vector<ObjectPath>* object_paths);
435ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
436ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Gets the array of bytes at the current iterator position. It then parses
437ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // this binary blob into the protocol buffer supplied.
438ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns true and advances the iterator on success. On failure returns false
439ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // and emits an error message on the source of the failure. The two most
440ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // common errors come from the iterator not currently being at a byte array or
441ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // the wrong type of protocol buffer is passed in and the parse fails.
442ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool PopArrayOfBytesAsProto(google::protobuf::MessageLite* protobuf);
443ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
444ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Gets the byte from the variant data container at the current iterator
445ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // position.
446ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns true and advances the iterator on success.
447ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
448ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Variants are widely used in D-Bus services so it's worth having a
449ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // specialized function. For instance, The return value type of
450ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // "org.freedesktop.DBus.Properties.Get" is a variant.
451cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  bool PopVariantOfByte(uint8_t* value);
452ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool PopVariantOfBool(bool* value);
453cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  bool PopVariantOfInt16(int16_t* value);
454cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  bool PopVariantOfUint16(uint16_t* value);
455cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  bool PopVariantOfInt32(int32_t* value);
456cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  bool PopVariantOfUint32(uint32_t* value);
457cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  bool PopVariantOfInt64(int64_t* value);
458cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  bool PopVariantOfUint64(uint64_t* value);
459ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool PopVariantOfDouble(double* value);
460ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool PopVariantOfString(std::string* value);
461ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool PopVariantOfObjectPath(ObjectPath* value);
462ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
463ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Get the data type of the value at the current iterator
464ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // position. INVALID_DATA will be returned if the iterator points to the
465ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // end of the message.
466ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  Message::DataType GetDataType();
467ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
468ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Get the DBus signature of the value at the current iterator position.
469ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // An empty string will be returned if the iterator points to the end of
470ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // the message.
471ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  std::string GetDataSignature();
472ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
473ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat private:
474ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns true if the data type at the current iterator position
475ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // matches the given D-Bus type, such as DBUS_TYPE_BYTE.
476ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool CheckDataType(int dbus_type);
477ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
478ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Helper function used to implement PopByte() etc.
479ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool PopBasic(int dbus_type, void *value);
480ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
481ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Helper function used to implement PopArray() etc.
482ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool PopContainer(int dbus_type, MessageReader* sub_reader);
483ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
484ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Helper function used to implement PopVariantOfByte() etc.
485ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool PopVariantOfBasic(int dbus_type, void* value);
486ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
487ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  Message* message_;
488ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  DBusMessageIter raw_message_iter_;
489ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
490ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  DISALLOW_COPY_AND_ASSIGN(MessageReader);
491ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat};
492ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
493ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat}  // namespace dbus
494ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
495ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#endif  // DBUS_MESSAGE_H_
496