class DBus::Message
D-Bus message class¶ ↑
Class that holds any type of message that travels over the bus.
Constants
- DESTINATION
- ENDIANNESS
- ENDIANNESS_CHAR
“l” or “B”
- ERROR
Errormessage type.- ERROR_NAME
- INTERFACE
- INVALID
FIXME: following message type constants should be under Message::Type IMO well, yeah sure
Invalid message type.
- MEMBER
- MESSAGE_SIGNATURE
Typeof a message (by specification).- METHOD_CALL
Methodcall message type.- METHOD_RETURN
Methodcall return value message type.- NO_AUTO_START
Messageflag signifying that no automatic start is required/must be performed.- NO_REPLY_EXPECTED
Messageflag signyfing that no reply is expected.- PATH
FIXME: what are these? a message element constant enumeration? See method below, in a message, you have and array of optional parameters that come with an index, to determine their meaning. The values are in spec, more a definition than an enumeration.
- REPLY_SERIAL
- RESERVED_PATH
- SENDER
- SIGNAL
Signalmessage type.- SIGNATURE
- TYPE_NAMES
Names used by signal match rules
Attributes
The destination connection of the object that must be used/was used.
The name of the error (in case of an error message type).
The interface of the object that must be used/was used.
The interface member (method/signal name) of the object that must be used/was used.
The type of the message.
The parameters of the message.
The path of the object instance the message must be sent to/is sent from.
The protocol.
@return [Integer] (u32)
The serial number of the message this message is a reply for.
The sender of the message.
@return [Integer] (u32)
The serial of the message.
The signature of the message contents.
Public Class Methods
Create an error reply to a message msg.
# File lib/dbus/message.rb 123 def self.error(msg, error_name, description = nil) 124 ErrorMessage.new(error_name, description).reply_to(msg) 125 end
Create a regular reply to a message msg.
# File lib/dbus/message.rb 118 def self.method_return(msg) 119 MethodReturnMessage.new.reply_to(msg) 120 end
Create a message with message type mtype with default values and a unique serial number.
# File lib/dbus/message.rb 83 def initialize(mtype = INVALID) 84 @message_type = mtype 85 86 @flags = 0 87 @protocol = 1 88 @body_length = 0 89 @signature = "" 90 @@serial_mutex.synchronize do 91 @serial = @@serial 92 @@serial += 1 93 end 94 @params = [] 95 @destination = nil 96 @interface = nil 97 @error_name = nil 98 @member = nil 99 @path = nil 100 @reply_serial = nil 101 @flags = NO_REPLY_EXPECTED if mtype == METHOD_RETURN 102 end
Public Instance Methods
Add a parameter val of type type to the message.
# File lib/dbus/message.rb 137 def add_param(type, val) 138 type = type.chr if type.is_a?(Integer) 139 @signature += type.to_s 140 @params << [type, val] 141 end
Make a new exception from ex, mark it as being caused by this message @api private
# File lib/dbus/message.rb 243 def annotate_exception(exc) 244 new_exc = exc.exception("#{exc}; caused by #{self}") 245 new_exc.set_backtrace(exc.backtrace) 246 new_exc 247 end
Marshall the message with its current set parameters and return it in a packet form. @return [String]
# File lib/dbus/message.rb 166 def marshall 167 if @path == RESERVED_PATH 168 # the bus would disconnect us, better explain why 169 raise "Cannot send a message with the reserved path #{RESERVED_PATH}: #{inspect}" 170 end 171 172 params_marshaller = PacketMarshaller.new(endianness: ENDIANNESS) 173 @params.each do |type, value| 174 params_marshaller.append(type, value) 175 end 176 @body_length = params_marshaller.packet.bytesize 177 178 marshaller = PacketMarshaller.new(endianness: ENDIANNESS) 179 marshaller.append(Type::BYTE, ENDIANNESS_CHAR.ord) 180 marshaller.append(Type::BYTE, @message_type) 181 marshaller.append(Type::BYTE, @flags) 182 marshaller.append(Type::BYTE, @protocol) 183 marshaller.append(Type::UINT32, @body_length) 184 marshaller.append(Type::UINT32, @serial) 185 186 headers = [] 187 headers << [PATH, ["o", @path]] if @path 188 headers << [INTERFACE, ["s", @interface]] if @interface 189 headers << [MEMBER, ["s", @member]] if @member 190 headers << [ERROR_NAME, ["s", @error_name]] if @error_name 191 headers << [REPLY_SERIAL, ["u", @reply_serial]] if @reply_serial 192 headers << [DESTINATION, ["s", @destination]] if @destination 193 # SENDER is not sent, the message bus fills it in instead 194 headers << [SIGNATURE, ["g", @signature]] if @signature != "" 195 marshaller.append("a(yv)", headers) 196 197 marshaller.align(8) 198 199 marshaller.packet + params_marshaller.packet 200 end
@return [String] name of message type, as used in match rules:
"method_call", "method_return", "signal", "error"
# File lib/dbus/message.rb 113 def message_type_s 114 TYPE_NAMES[message_type] || "unknown_type_#{message_type}" 115 end
Mark this message as a reply to a another message msg, taking the serial number of msg as reply serial and the sender of msg as destination.
# File lib/dbus/message.rb 130 def reply_to(msg) 131 @reply_serial = msg.serial 132 @destination = msg.sender 133 self 134 end
# File lib/dbus/message.rb 104 def to_s 105 "#{message_type} sender=#{sender} -> dest=#{destination} " \ 106 "serial=#{serial} reply_serial=#{reply_serial} " \ 107 "path=#{path}; interface=#{interface}; member=#{member} " \ 108 "error_name=#{error_name}" 109 end
Unmarshall a packet contained in the buffer buf and set the parameters of the message object according the data found in the buffer. @return [Array(Message,Integer)]
the detected message (self) and the index pointer of the buffer where the message data ended.
# File lib/dbus/message.rb 208 def unmarshall_buffer(buf) 209 pu = PacketUnmarshaller.new(buf, RawMessage.endianness(buf[0])) 210 mdata = pu.unmarshall(MESSAGE_SIGNATURE) 211 _, @message_type, @flags, @protocol, @body_length, @serial, 212 headers = mdata 213 214 headers.each do |struct| 215 case struct[0] 216 when PATH 217 @path = struct[1] 218 when INTERFACE 219 @interface = struct[1] 220 when MEMBER 221 @member = struct[1] 222 when ERROR_NAME 223 @error_name = struct[1] 224 when REPLY_SERIAL 225 @reply_serial = struct[1] 226 when DESTINATION 227 @destination = struct[1] 228 when SENDER 229 @sender = struct[1] 230 when SIGNATURE 231 @signature = struct[1] 232 end 233 end 234 pu.align_body 235 if @body_length.positive? && @signature 236 @params = pu.unmarshall(@signature, @body_length) 237 end 238 [self, pu.consumed_size] 239 end