ruby-dbus 0.12.0 → 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/NEWS.md +344 -0
- data/Rakefile +21 -15
- data/VERSION +1 -1
- data/doc/Reference.md +26 -37
- data/examples/doc/_extract_examples +4 -4
- data/examples/gdbus/gdbus +40 -39
- data/examples/no-introspect/nm-test.rb +1 -3
- data/examples/no-introspect/tracker-test.rb +2 -4
- data/examples/rhythmbox/playpause.rb +1 -2
- data/examples/service/call_service.rb +0 -3
- data/examples/service/service_newapi.rb +3 -4
- data/examples/simple/call_introspect.rb +0 -3
- data/examples/simple/get_id.rb +1 -3
- data/examples/simple/properties.rb +3 -4
- data/examples/utils/listnames.rb +6 -7
- data/examples/utils/notify.rb +3 -5
- data/lib/dbus.rb +8 -20
- data/lib/dbus/auth.rb +59 -61
- data/lib/dbus/bus.rb +86 -97
- data/lib/dbus/error.rb +1 -1
- data/lib/dbus/export.rb +20 -18
- data/lib/dbus/introspect.rb +26 -28
- data/lib/dbus/logger.rb +1 -1
- data/lib/dbus/marshall.rb +72 -74
- data/lib/dbus/matchrule.rb +22 -26
- data/lib/dbus/message.rb +24 -33
- data/lib/dbus/message_queue.rb +30 -30
- data/lib/dbus/proxy_object.rb +34 -30
- data/lib/dbus/proxy_object_factory.rb +5 -2
- data/lib/dbus/proxy_object_interface.rb +10 -8
- data/lib/dbus/type.rb +154 -156
- data/lib/dbus/xml.rb +22 -16
- data/ruby-dbus.gemspec +15 -3
- data/spec/async_spec.rb +2 -4
- data/spec/binding_spec.rb +1 -5
- data/spec/bus_and_xml_backend_spec.rb +6 -9
- data/spec/bus_spec.rb +1 -1
- data/spec/byte_array_spec.rb +0 -2
- data/spec/err_msg_spec.rb +13 -10
- data/spec/introspect_xml_parser_spec.rb +2 -2
- data/spec/introspection_spec.rb +1 -1
- data/spec/main_loop_spec.rb +4 -5
- data/spec/property_spec.rb +0 -3
- data/spec/proxy_object_spec.rb +42 -0
- data/spec/server_robustness_spec.rb +0 -2
- data/spec/service_newapi.rb +51 -41
- data/spec/session_bus_spec.rb +6 -7
- data/spec/signal_spec.rb +2 -3
- data/spec/spec_helper.rb +28 -24
- data/spec/thread_safety_spec.rb +1 -2
- data/spec/type_spec.rb +2 -2
- data/spec/value_spec.rb +7 -10
- data/spec/variant_spec.rb +15 -16
- metadata +60 -3
- data/NEWS +0 -279
data/lib/dbus/error.rb
CHANGED
data/lib/dbus/export.rb
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
# License, version 2.1 as published by the Free Software Foundation.
|
9
9
|
# See the file "COPYING" for the exact licensing terms.
|
10
10
|
|
11
|
-
require
|
11
|
+
require "thread"
|
12
12
|
|
13
13
|
module DBus
|
14
14
|
# Exported object type
|
@@ -21,10 +21,12 @@ module DBus
|
|
21
21
|
attr_reader :path
|
22
22
|
# The interfaces that the object supports. Hash: String => Interface
|
23
23
|
class_attribute :intfs
|
24
|
+
self.intfs = {}
|
25
|
+
|
24
26
|
# The service that the object is exported by.
|
25
27
|
attr_writer :service
|
26
28
|
|
27
|
-
@@cur_intf = nil
|
29
|
+
@@cur_intf = nil # Interface
|
28
30
|
@@intfs_mutex = Mutex.new
|
29
31
|
|
30
32
|
# Create a new object with a given _path_.
|
@@ -34,30 +36,24 @@ module DBus
|
|
34
36
|
@service = nil
|
35
37
|
end
|
36
38
|
|
37
|
-
# State that the object implements the given _intf_.
|
38
|
-
def implements(intf)
|
39
|
-
# use a setter
|
40
|
-
self.intfs = (self.intfs || {}).merge({intf.name => intf})
|
41
|
-
end
|
42
|
-
|
43
39
|
# Dispatch a message _msg_ to call exported methods
|
44
40
|
def dispatch(msg)
|
45
41
|
case msg.message_type
|
46
42
|
when Message::METHOD_CALL
|
47
43
|
reply = nil
|
48
44
|
begin
|
49
|
-
if
|
45
|
+
if !intfs[msg.interface]
|
50
46
|
raise DBus.error("org.freedesktop.DBus.Error.UnknownMethod"),
|
51
|
-
|
47
|
+
"Interface \"#{msg.interface}\" of object \"#{msg.path}\" doesn't exist"
|
52
48
|
end
|
53
|
-
meth =
|
54
|
-
if
|
49
|
+
meth = intfs[msg.interface].methods[msg.member.to_sym]
|
50
|
+
if !meth
|
55
51
|
raise DBus.error("org.freedesktop.DBus.Error.UnknownMethod"),
|
56
|
-
|
52
|
+
"Method \"#{msg.member}\" on interface \"#{msg.interface}\" of object \"#{msg.path}\" doesn't exist"
|
57
53
|
end
|
58
54
|
methname = Object.make_method_name(msg.interface, msg.member)
|
59
55
|
retdata = method(methname).call(*msg.params)
|
60
|
-
retdata =
|
56
|
+
retdata = [*retdata]
|
61
57
|
|
62
58
|
reply = Message.method_return(msg)
|
63
59
|
meth.rets.zip(retdata).each do |rsig, rdata|
|
@@ -75,9 +71,15 @@ module DBus
|
|
75
71
|
# belong to.
|
76
72
|
def self.dbus_interface(s)
|
77
73
|
@@intfs_mutex.synchronize do
|
78
|
-
|
74
|
+
@@cur_intf = intfs[s]
|
75
|
+
if !@@cur_intf
|
79
76
|
@@cur_intf = Interface.new(s)
|
80
|
-
|
77
|
+
# As this is a mutable class_attr, we cannot use
|
78
|
+
# self.intfs[s] = @@cur_intf # Hash#[]=
|
79
|
+
# as that would modify parent class attr in place.
|
80
|
+
# Using the setter lets a subclass have the new value
|
81
|
+
# while the superclass keeps the old one.
|
82
|
+
self.intfs = intfs.merge(s => @@cur_intf)
|
81
83
|
end
|
82
84
|
yield
|
83
85
|
@@cur_intf = nil
|
@@ -96,7 +98,7 @@ module DBus
|
|
96
98
|
def self.dbus_method(sym, protoype = "", &block)
|
97
99
|
raise UndefinedInterface, sym if @@cur_intf.nil?
|
98
100
|
@@cur_intf.define(Method.new(sym.to_s).from_prototype(protoype))
|
99
|
-
define_method(Object.make_method_name(@@cur_intf.name, sym.to_s), &block)
|
101
|
+
define_method(Object.make_method_name(@@cur_intf.name, sym.to_s), &block)
|
100
102
|
end
|
101
103
|
|
102
104
|
# Emits a signal from the object with the given _interface_, signal
|
@@ -117,10 +119,10 @@ module DBus
|
|
117
119
|
end
|
118
120
|
|
119
121
|
####################################################################
|
120
|
-
private
|
121
122
|
|
122
123
|
# Helper method that returns a method name generated from the interface
|
123
124
|
# name _intfname_ and method name _methname_.
|
125
|
+
# @api private
|
124
126
|
def self.make_method_name(intfname, methname)
|
125
127
|
"#{intfname}%%#{methname}"
|
126
128
|
end
|
data/lib/dbus/introspect.rb
CHANGED
@@ -10,9 +10,9 @@
|
|
10
10
|
|
11
11
|
module DBus
|
12
12
|
# Regular expressions that should match all method names.
|
13
|
-
|
13
|
+
METHOD_SIGNAL_RE = /^[A-Za-z][A-Za-z0-9_]*$/
|
14
14
|
# Regular expressions that should match all interface names.
|
15
|
-
|
15
|
+
INTERFACE_ELEMENT_RE = /^[A-Za-z][A-Za-z0-9_]*$/
|
16
16
|
|
17
17
|
# Exception raised when an unknown signal is used.
|
18
18
|
class UnknownSignal < Exception
|
@@ -41,29 +41,30 @@ module DBus
|
|
41
41
|
def initialize(name)
|
42
42
|
validate_name(name)
|
43
43
|
@name = name
|
44
|
-
@methods
|
44
|
+
@methods = {}
|
45
|
+
@signals = {}
|
45
46
|
end
|
46
47
|
|
47
48
|
# Validates a service _name_.
|
48
49
|
def validate_name(name)
|
49
50
|
raise InvalidIntrospectionData if name.bytesize > 255
|
50
|
-
raise InvalidIntrospectionData if name =~ /^\./
|
51
|
+
raise InvalidIntrospectionData if name =~ /^\./ || name =~ /\.$/
|
51
52
|
raise InvalidIntrospectionData if name =~ /\.\./
|
52
|
-
raise InvalidIntrospectionData if
|
53
|
+
raise InvalidIntrospectionData if !(name =~ /\./)
|
53
54
|
name.split(".").each do |element|
|
54
|
-
raise InvalidIntrospectionData if
|
55
|
+
raise InvalidIntrospectionData if !(element =~ INTERFACE_ELEMENT_RE)
|
55
56
|
end
|
56
57
|
end
|
57
58
|
|
58
59
|
# Helper method for defining a method _m_.
|
59
60
|
def define(m)
|
60
|
-
if m.
|
61
|
+
if m.is_a?(Method)
|
61
62
|
@methods[m.name.to_sym] = m
|
62
|
-
elsif m.
|
63
|
+
elsif m.is_a?(Signal)
|
63
64
|
@signals[m.name.to_sym] = m
|
64
65
|
end
|
65
66
|
end
|
66
|
-
alias
|
67
|
+
alias << define
|
67
68
|
|
68
69
|
# Defines a method with name _id_ and a given _prototype_ in the
|
69
70
|
# interface.
|
@@ -87,9 +88,8 @@ module DBus
|
|
87
88
|
# backward compatibility, deprecated
|
88
89
|
def [](index)
|
89
90
|
case index
|
90
|
-
|
91
|
-
|
92
|
-
else nil
|
91
|
+
when 0 then name
|
92
|
+
when 1 then type
|
93
93
|
end
|
94
94
|
end
|
95
95
|
end
|
@@ -106,16 +106,15 @@ module DBus
|
|
106
106
|
|
107
107
|
# Validates element _name_.
|
108
108
|
def validate_name(name)
|
109
|
-
if (
|
110
|
-
|
111
|
-
end
|
109
|
+
return if (name =~ METHOD_SIGNAL_RE) && (name.bytesize <= 255)
|
110
|
+
raise InvalidMethodName, name
|
112
111
|
end
|
113
112
|
|
114
113
|
# Creates a new element with the given _name_.
|
115
114
|
def initialize(name)
|
116
115
|
validate_name(name.to_s)
|
117
116
|
@name = name
|
118
|
-
@params =
|
117
|
+
@params = []
|
119
118
|
end
|
120
119
|
|
121
120
|
# Adds a formal parameter with _name_ and _signature_
|
@@ -140,7 +139,7 @@ module DBus
|
|
140
139
|
# Creates a new method interface element with the given _name_.
|
141
140
|
def initialize(name)
|
142
141
|
super(name)
|
143
|
-
@rets =
|
142
|
+
@rets = []
|
144
143
|
end
|
145
144
|
|
146
145
|
# Add a return value _name_ and _signature_.
|
@@ -172,16 +171,16 @@ module DBus
|
|
172
171
|
|
173
172
|
# Return an XML string representation of the method interface elment.
|
174
173
|
def to_xml
|
175
|
-
xml = %
|
174
|
+
xml = %(<method name="#{@name}">\n)
|
176
175
|
@params.each do |param|
|
177
|
-
name = param.name ? %
|
178
|
-
xml += %
|
176
|
+
name = param.name ? %(name="#{param.name}" ) : ""
|
177
|
+
xml += %(<arg #{name}direction="in" type="#{param.type}"/>\n)
|
179
178
|
end
|
180
179
|
@rets.each do |param|
|
181
|
-
name = param.name ? %
|
182
|
-
xml += %
|
180
|
+
name = param.name ? %(name="#{param.name}" ) : ""
|
181
|
+
xml += %(<arg #{name}direction="out" type="#{param.type}"/>\n)
|
183
182
|
end
|
184
|
-
xml += %
|
183
|
+
xml += %(</method>\n)
|
185
184
|
xml
|
186
185
|
end
|
187
186
|
end # class Method
|
@@ -206,14 +205,13 @@ module DBus
|
|
206
205
|
|
207
206
|
# Return an XML string representation of the signal interface elment.
|
208
207
|
def to_xml
|
209
|
-
xml = %
|
208
|
+
xml = %(<signal name="#{@name}">\n)
|
210
209
|
@params.each do |param|
|
211
|
-
name = param.name ? %
|
212
|
-
xml += %
|
210
|
+
name = param.name ? %(name="#{param.name}" ) : ""
|
211
|
+
xml += %(<arg #{name}type="#{param.type}"/>\n)
|
213
212
|
end
|
214
|
-
xml += %
|
213
|
+
xml += %(</signal>\n)
|
215
214
|
xml
|
216
215
|
end
|
217
216
|
end # class Signal
|
218
217
|
end # module DBus
|
219
|
-
|
data/lib/dbus/logger.rb
CHANGED
data/lib/dbus/marshall.rb
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
# License, version 2.1 as published by the Free Software Foundation.
|
9
9
|
# See the file "COPYING" for the exact licensing terms.
|
10
10
|
|
11
|
-
require
|
11
|
+
require "socket"
|
12
12
|
|
13
13
|
# = D-Bus main module
|
14
14
|
#
|
@@ -23,7 +23,7 @@ module DBus
|
|
23
23
|
# Class that handles the conversion (unmarshalling) of payload data
|
24
24
|
# to Array.
|
25
25
|
class PacketUnmarshaller
|
26
|
-
# Index pointer that points to the byte in the data that is
|
26
|
+
# Index pointer that points to the byte in the data that is
|
27
27
|
# currently being processed.
|
28
28
|
#
|
29
29
|
# Used to kown what part of the buffer has been consumed by unmarshalling.
|
@@ -32,7 +32,8 @@ module DBus
|
|
32
32
|
|
33
33
|
# Create a new unmarshaller for the given data _buffer_ and _endianness_.
|
34
34
|
def initialize(buffer, endianness)
|
35
|
-
@buffy
|
35
|
+
@buffy = buffer.dup
|
36
|
+
@endianness = endianness
|
36
37
|
if @endianness == BIG_END
|
37
38
|
@uint32 = "N"
|
38
39
|
@uint16 = "n"
|
@@ -50,13 +51,13 @@ module DBus
|
|
50
51
|
# Unmarshall the buffer for a given _signature_ and length _len_.
|
51
52
|
# Return an array of unmarshalled objects
|
52
53
|
def unmarshall(signature, len = nil)
|
53
|
-
if len
|
54
|
+
if !len.nil?
|
54
55
|
if @buffy.bytesize < @idx + len
|
55
56
|
raise IncompleteBufferException
|
56
57
|
end
|
57
58
|
end
|
58
59
|
sigtree = Type::Parser.new(signature).parse
|
59
|
-
ret =
|
60
|
+
ret = []
|
60
61
|
sigtree.each do |elem|
|
61
62
|
ret << do_parse(elem)
|
62
63
|
end
|
@@ -83,18 +84,18 @@ module DBus
|
|
83
84
|
private
|
84
85
|
|
85
86
|
# Retrieve the next _nbytes_ number of bytes from the buffer.
|
86
|
-
def
|
87
|
+
def read(nbytes)
|
87
88
|
raise IncompleteBufferException if @idx + nbytes > @buffy.bytesize
|
88
89
|
ret = @buffy.slice(@idx, nbytes)
|
89
90
|
@idx += nbytes
|
90
91
|
ret
|
91
92
|
end
|
92
93
|
|
93
|
-
#
|
94
|
+
# Read the string length and string itself from the buffer.
|
94
95
|
# Return the string.
|
95
|
-
def
|
96
|
+
def read_string
|
96
97
|
align(4)
|
97
|
-
str_sz =
|
98
|
+
str_sz = read(4).unpack(@uint32)[0]
|
98
99
|
ret = @buffy.slice(@idx, str_sz)
|
99
100
|
raise IncompleteBufferException if @idx + str_sz + 1 > @buffy.bytesize
|
100
101
|
@idx += str_sz
|
@@ -106,10 +107,10 @@ module DBus
|
|
106
107
|
ret
|
107
108
|
end
|
108
109
|
|
109
|
-
#
|
110
|
+
# Read the signature length and signature itself from the buffer.
|
110
111
|
# Return the signature.
|
111
|
-
def
|
112
|
-
str_sz =
|
112
|
+
def read_signature
|
113
|
+
str_sz = read(1).unpack("C")[0]
|
113
114
|
ret = @buffy.slice(@idx, str_sz)
|
114
115
|
raise IncompleteBufferException if @idx + str_sz + 1 >= @buffy.bytesize
|
115
116
|
@idx += str_sz
|
@@ -127,94 +128,91 @@ module DBus
|
|
127
128
|
packet = nil
|
128
129
|
case signature.sigtype
|
129
130
|
when Type::BYTE
|
130
|
-
packet =
|
131
|
+
packet = read(1).unpack("C")[0]
|
131
132
|
when Type::UINT16
|
132
133
|
align(2)
|
133
|
-
packet =
|
134
|
+
packet = read(2).unpack(@uint16)[0]
|
134
135
|
when Type::INT16
|
135
136
|
align(4)
|
136
|
-
packet =
|
137
|
+
packet = read(4).unpack(@uint16)[0]
|
137
138
|
if (packet & 0x8000) != 0
|
138
139
|
packet -= 0x10000
|
139
140
|
end
|
140
141
|
when Type::UINT32, Type::UNIX_FD
|
141
142
|
align(4)
|
142
|
-
packet =
|
143
|
+
packet = read(4).unpack(@uint32)[0]
|
143
144
|
when Type::INT32
|
144
145
|
align(4)
|
145
|
-
packet =
|
146
|
+
packet = read(4).unpack(@uint32)[0]
|
146
147
|
if (packet & 0x80000000) != 0
|
147
148
|
packet -= 0x100000000
|
148
149
|
end
|
149
150
|
when Type::UINT64
|
150
151
|
align(8)
|
151
|
-
packet_l =
|
152
|
-
packet_h =
|
153
|
-
if @endianness == LIL_END
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
152
|
+
packet_l = read(4).unpack(@uint32)[0]
|
153
|
+
packet_h = read(4).unpack(@uint32)[0]
|
154
|
+
packet = if @endianness == LIL_END
|
155
|
+
packet_l + packet_h * 2**32
|
156
|
+
else
|
157
|
+
packet_l * 2**32 + packet_h
|
158
|
+
end
|
158
159
|
when Type::INT64
|
159
160
|
align(8)
|
160
|
-
packet_l =
|
161
|
-
packet_h =
|
162
|
-
if @endianness == LIL_END
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
161
|
+
packet_l = read(4).unpack(@uint32)[0]
|
162
|
+
packet_h = read(4).unpack(@uint32)[0]
|
163
|
+
packet = if @endianness == LIL_END
|
164
|
+
packet_l + packet_h * 2**32
|
165
|
+
else
|
166
|
+
packet_l * 2**32 + packet_h
|
167
|
+
end
|
167
168
|
if (packet & 0x8000000000000000) != 0
|
168
169
|
packet -= 0x10000000000000000
|
169
170
|
end
|
170
171
|
when Type::DOUBLE
|
171
172
|
align(8)
|
172
|
-
packet =
|
173
|
+
packet = read(8).unpack(@double)[0]
|
173
174
|
when Type::BOOLEAN
|
174
175
|
align(4)
|
175
|
-
v =
|
176
|
-
raise InvalidPacketException if
|
176
|
+
v = read(4).unpack(@uint32)[0]
|
177
|
+
raise InvalidPacketException if ![0, 1].member?(v)
|
177
178
|
packet = (v == 1)
|
178
179
|
when Type::ARRAY
|
179
180
|
align(4)
|
180
181
|
# checks please
|
181
|
-
array_sz =
|
182
|
-
raise InvalidPacketException if array_sz >
|
182
|
+
array_sz = read(4).unpack(@uint32)[0]
|
183
|
+
raise InvalidPacketException if array_sz > 67_108_864
|
183
184
|
|
184
185
|
align(signature.child.alignment)
|
185
186
|
raise IncompleteBufferException if @idx + array_sz > @buffy.bytesize
|
186
187
|
|
187
|
-
packet =
|
188
|
+
packet = []
|
188
189
|
start_idx = @idx
|
189
190
|
while @idx - start_idx < array_sz
|
190
191
|
packet << do_parse(signature.child)
|
191
192
|
end
|
192
193
|
|
193
|
-
if signature.child.sigtype == Type::DICT_ENTRY
|
194
|
-
packet = packet
|
195
|
-
hash[pair[0]] = pair[1]
|
196
|
-
hash
|
197
|
-
end
|
194
|
+
if signature.child.sigtype == Type::DICT_ENTRY
|
195
|
+
packet = Hash[packet]
|
198
196
|
end
|
199
197
|
when Type::STRUCT
|
200
198
|
align(8)
|
201
|
-
packet =
|
199
|
+
packet = []
|
202
200
|
signature.members.each do |elem|
|
203
201
|
packet << do_parse(elem)
|
204
202
|
end
|
205
203
|
when Type::VARIANT
|
206
|
-
string =
|
204
|
+
string = read_signature
|
207
205
|
# error checking please
|
208
206
|
sig = Type::Parser.new(string).parse[0]
|
209
207
|
align(sig.alignment)
|
210
208
|
packet = do_parse(sig)
|
211
209
|
when Type::OBJECT_PATH
|
212
|
-
packet =
|
210
|
+
packet = read_string
|
213
211
|
when Type::STRING
|
214
|
-
packet =
|
215
|
-
packet.force_encoding(
|
212
|
+
packet = read_string
|
213
|
+
packet.force_encoding("UTF-8")
|
216
214
|
when Type::SIGNATURE
|
217
|
-
packet =
|
215
|
+
packet = read_signature
|
218
216
|
when Type::DICT_ENTRY
|
219
217
|
align(8)
|
220
218
|
key = do_parse(signature.members[0])
|
@@ -222,7 +220,7 @@ module DBus
|
|
222
220
|
packet = [key, value]
|
223
221
|
else
|
224
222
|
raise NotImplementedError,
|
225
|
-
|
223
|
+
"sigtype: #{signature.sigtype} (#{signature.sigtype.chr})"
|
226
224
|
end
|
227
225
|
packet
|
228
226
|
end # def do_parse
|
@@ -241,7 +239,7 @@ module DBus
|
|
241
239
|
# empty packet.
|
242
240
|
def initialize(offset = 0)
|
243
241
|
@packet = ""
|
244
|
-
@offset = offset
|
242
|
+
@offset = offset # for correct alignment of nested marshallers
|
245
243
|
end
|
246
244
|
|
247
245
|
# Round _n_ up to the specified power of two, _a_
|
@@ -282,7 +280,7 @@ module DBus
|
|
282
280
|
contentidx = @packet.bytesize
|
283
281
|
yield
|
284
282
|
sz = @packet.bytesize - contentidx
|
285
|
-
raise InvalidPacketException if sz >
|
283
|
+
raise InvalidPacketException if sz > 67_108_864
|
286
284
|
@packet[sizeidx...sizeidx + 4] = [sz].pack("L")
|
287
285
|
end
|
288
286
|
|
@@ -298,8 +296,8 @@ module DBus
|
|
298
296
|
def append(type, val)
|
299
297
|
raise TypeException, "Cannot send nil" if val.nil?
|
300
298
|
|
301
|
-
type = type.chr if type.
|
302
|
-
type = Type::Parser.new(type).parse[0] if type.
|
299
|
+
type = type.chr if type.is_a?(Fixnum)
|
300
|
+
type = Type::Parser.new(type).parse[0] if type.is_a?(String)
|
303
301
|
case type.sigtype
|
304
302
|
when Type::BYTE
|
305
303
|
@packet += val.chr
|
@@ -307,11 +305,11 @@ module DBus
|
|
307
305
|
align(4)
|
308
306
|
@packet += [val].pack("L")
|
309
307
|
when Type::UINT64
|
310
|
-
|
311
|
-
|
308
|
+
align(8)
|
309
|
+
@packet += [val].pack("Q")
|
312
310
|
when Type::INT64
|
313
|
-
|
314
|
-
|
311
|
+
align(8)
|
312
|
+
@packet += [val].pack("q")
|
315
313
|
when Type::INT32
|
316
314
|
align(4)
|
317
315
|
@packet += [val].pack("l")
|
@@ -323,14 +321,14 @@ module DBus
|
|
323
321
|
@packet += [val].pack("s")
|
324
322
|
when Type::DOUBLE
|
325
323
|
align(8)
|
326
|
-
|
324
|
+
@packet += [val].pack("d")
|
327
325
|
when Type::BOOLEAN
|
328
326
|
align(4)
|
329
|
-
if val
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
327
|
+
@packet += if val
|
328
|
+
[1].pack("L")
|
329
|
+
else
|
330
|
+
[0].pack("L")
|
331
|
+
end
|
334
332
|
when Type::OBJECT_PATH
|
335
333
|
append_string(val)
|
336
334
|
when Type::STRING
|
@@ -339,7 +337,7 @@ module DBus
|
|
339
337
|
append_signature(val)
|
340
338
|
when Type::VARIANT
|
341
339
|
vartype = nil
|
342
|
-
if val.is_a?(Array)
|
340
|
+
if val.is_a?(Array) && val.size == 2
|
343
341
|
if val[0].is_a?(DBus::Type::Type)
|
344
342
|
vartype, vardata = val
|
345
343
|
elsif val[0].is_a?(String)
|
@@ -363,16 +361,16 @@ module DBus
|
|
363
361
|
sub.append(vartype, vardata)
|
364
362
|
@packet += sub.packet
|
365
363
|
when Type::ARRAY
|
366
|
-
if val.
|
364
|
+
if val.is_a?(Hash)
|
367
365
|
raise TypeException, "Expected an Array but got a Hash" if type.child.sigtype != Type::DICT_ENTRY
|
368
366
|
# Damn ruby rocks here
|
369
367
|
val = val.to_a
|
370
368
|
end
|
371
369
|
# If string is recieved and ay is expected, explode the string
|
372
|
-
if val.
|
370
|
+
if val.is_a?(String) && type.child.sigtype == Type::BYTE
|
373
371
|
val = val.bytes
|
374
372
|
end
|
375
|
-
if
|
373
|
+
if !val.is_a?(Enumerable)
|
376
374
|
raise TypeException, "Expected an Enumerable of #{type.child.inspect} but got a #{val.class}"
|
377
375
|
end
|
378
376
|
array(type.child) do
|
@@ -381,9 +379,9 @@ module DBus
|
|
381
379
|
end
|
382
380
|
end
|
383
381
|
when Type::STRUCT, Type::DICT_ENTRY
|
384
|
-
# TODO use duck typing, val.respond_to?
|
385
|
-
raise TypeException, "Struct/DE expects an Array" if
|
386
|
-
if type.sigtype == Type::DICT_ENTRY
|
382
|
+
# TODO: use duck typing, val.respond_to?
|
383
|
+
raise TypeException, "Struct/DE expects an Array" if !val.is_a?(Array)
|
384
|
+
if type.sigtype == Type::DICT_ENTRY && val.size != 2
|
387
385
|
raise TypeException, "Dict entry expects a pair"
|
388
386
|
end
|
389
387
|
if type.members.size != val.size
|
@@ -396,7 +394,7 @@ module DBus
|
|
396
394
|
end
|
397
395
|
else
|
398
396
|
raise NotImplementedError,
|
399
|
-
|
397
|
+
"sigtype: #{type.sigtype} (#{type.sigtype.chr})"
|
400
398
|
end
|
401
399
|
end # def append
|
402
400
|
|
@@ -414,10 +412,10 @@ module DBus
|
|
414
412
|
elsif value.is_a? Symbol
|
415
413
|
["s", value.to_s]
|
416
414
|
elsif value.is_a? Array
|
417
|
-
["av", value.map {|i| make_variant(i) }]
|
415
|
+
["av", value.map { |i| make_variant(i) }]
|
418
416
|
elsif value.is_a? Hash
|
419
417
|
h = {}
|
420
|
-
value.each_key {|k| h[k] = make_variant(value[k]) }
|
418
|
+
value.each_key { |k| h[k] = make_variant(value[k]) }
|
421
419
|
["a{sv}", h]
|
422
420
|
elsif value.respond_to? :to_str
|
423
421
|
["s", value.to_str]
|
@@ -429,6 +427,6 @@ module DBus
|
|
429
427
|
["x", i]
|
430
428
|
end
|
431
429
|
end
|
432
|
-
end
|
430
|
+
end
|
433
431
|
end # class PacketMarshaller
|
434
432
|
end # module DBus
|