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