rbus 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.txt +9 -0
- data/COPYING.txt +341 -0
- data/HACKING.txt +104 -0
- data/Manifest.txt +58 -0
- data/README.txt +17 -0
- data/Rakefile +97 -0
- data/TUTORIAL.txt +303 -0
- data/bin/rbus-send +165 -0
- data/examples/async_rb_and_notify.rb +56 -0
- data/examples/async_rb_loop.rb +52 -0
- data/examples/glib_async_rb_loop.rb +57 -0
- data/examples/glib_rhythmbox.rb +54 -0
- data/examples/hal_device_info.rb +54 -0
- data/examples/listnames.rb +37 -0
- data/examples/network_manager_get_properties.rb +50 -0
- data/examples/notification_bubble.rb +46 -0
- data/examples/rhythmbox_print_playing_uri.rb +41 -0
- data/examples/rhythmbox_signal_print_playing.rb +54 -0
- data/examples/rhythmbox_start_service.rb +39 -0
- data/examples/rhythmbox_toggle_playing.rb +46 -0
- data/lib/rbus.rb +25 -0
- data/lib/rbus/auth/auth.rb +53 -0
- data/lib/rbus/auth/dbus_cookie_sha1.rb +66 -0
- data/lib/rbus/auth/dummy.rb +37 -0
- data/lib/rbus/auth/external.rb +34 -0
- data/lib/rbus/auth/state_machine.rb +168 -0
- data/lib/rbus/bus/bus.rb +101 -0
- data/lib/rbus/bus/proxy.rb +137 -0
- data/lib/rbus/bus/transport.rb +125 -0
- data/lib/rbus/default.rb +29 -0
- data/lib/rbus/etc/exception.rb +44 -0
- data/lib/rbus/etc/log.rb +100 -0
- data/lib/rbus/etc/types.rb +56 -0
- data/lib/rbus/etc/version.rb +34 -0
- data/lib/rbus/glib.rb +29 -0
- data/lib/rbus/mainloop/glib.rb +77 -0
- data/lib/rbus/mainloop/mainloop.rb +84 -0
- data/lib/rbus/mainloop/observers.rb +149 -0
- data/lib/rbus/mainloop/thread.rb +78 -0
- data/lib/rbus/message/constants.rb +51 -0
- data/lib/rbus/message/marshal.rb +139 -0
- data/lib/rbus/message/message.rb +110 -0
- data/lib/rbus/message/reader.rb +108 -0
- data/lib/rbus/message/serial_generator.rb +48 -0
- data/lib/rbus/message/unmarshal.rb +171 -0
- data/lib/rbus/message/writer.rb +69 -0
- data/setup.rb +1608 -0
- data/spec/auth_spec.rb +123 -0
- data/spec/bus_spec.rb +178 -0
- data/spec/helpers/bus_mocks.rb +64 -0
- data/spec/helpers/spec_helper.rb +24 -0
- data/spec/mainloop_spec.rb +74 -0
- data/spec/marshal_spec.rb +91 -0
- data/spec/message_spec.rb +61 -0
- data/spec/observers_spec.rb +28 -0
- data/spec/proxy_spec.rb +120 -0
- data/spec/transport_spec.rb +187 -0
- data/spec/unmarshal_spec.rb +186 -0
- metadata +118 -0
data/lib/rbus/default.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#--
|
2
|
+
#
|
3
|
+
# R-Bus is a native Ruby implementation of the D-Bus protocol.
|
4
|
+
# Copyright (C) 2007 Kristoffer Lundén (kristoffer.lunden@gmail.com)
|
5
|
+
#
|
6
|
+
# This program is free software; you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU General Public License as published by
|
8
|
+
# the Free Software Foundation; either version 2 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# This program is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with this program; if not, write to the Free Software
|
18
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
19
|
+
# MA 02110-1301, USA. A copy of the GNU General Public License is
|
20
|
+
# also available at http://www.gnu.org/copyleft/gpl.html.
|
21
|
+
#
|
22
|
+
#++
|
23
|
+
#
|
24
|
+
base_dir = File.dirname(__FILE__)
|
25
|
+
%w{auth bus etc message}.each do |dir|
|
26
|
+
Dir[File.join(base_dir, dir, '*.rb')].sort.each { |lib| require lib }
|
27
|
+
end
|
28
|
+
|
29
|
+
require File.dirname(__FILE__) + '/mainloop/thread.rb'
|
@@ -0,0 +1,44 @@
|
|
1
|
+
#--
|
2
|
+
#
|
3
|
+
# R-Bus is a native Ruby implementation of the D-Bus protocol.
|
4
|
+
# Copyright (C) 2007 Kristoffer Lundén (kristoffer.lunden@gmail.com)
|
5
|
+
#
|
6
|
+
# This program is free software; you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU General Public License as published by
|
8
|
+
# the Free Software Foundation; either version 2 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# This program is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with this program; if not, write to the Free Software
|
18
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
19
|
+
# MA 02110-1301, USA. A copy of the GNU General Public License is
|
20
|
+
# also available at http://www.gnu.org/copyleft/gpl.html.
|
21
|
+
#
|
22
|
+
#++
|
23
|
+
#
|
24
|
+
module RBus
|
25
|
+
|
26
|
+
# Catch-all, simply do:
|
27
|
+
# rescue RBus::Exception => error
|
28
|
+
# if in doubt. :)
|
29
|
+
class Exception < RuntimeError; end
|
30
|
+
|
31
|
+
class AuthException < Exception
|
32
|
+
def initialize(msg = "Failed to authenticate with any mechanism.")
|
33
|
+
super(msg)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
class InvalidAddressException < Exception;end
|
37
|
+
class InvalidTransportException < Exception;end
|
38
|
+
class NotImplementedError < Exception;end
|
39
|
+
class TypeException < Exception;end
|
40
|
+
class MessageException < Exception;end
|
41
|
+
class IllegalEndianException < Exception;end
|
42
|
+
class InvalidProtocolException < Exception;end
|
43
|
+
class InvalidNameException < Exception;end
|
44
|
+
end
|
data/lib/rbus/etc/log.rb
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
#--
|
2
|
+
#
|
3
|
+
# R-Bus is a native Ruby implementation of the D-Bus protocol.
|
4
|
+
# Copyright (C) 2007 Kristoffer Lundén (kristoffer.lunden@gmail.com)
|
5
|
+
#
|
6
|
+
# This program is free software; you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU General Public License as published by
|
8
|
+
# the Free Software Foundation; either version 2 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# This program is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with this program; if not, write to the Free Software
|
18
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
19
|
+
# MA 02110-1301, USA. A copy of the GNU General Public License is
|
20
|
+
# also available at http://www.gnu.org/copyleft/gpl.html.
|
21
|
+
#
|
22
|
+
#++
|
23
|
+
#
|
24
|
+
require 'logger'
|
25
|
+
require 'pp'
|
26
|
+
require 'stringio'
|
27
|
+
module RBus
|
28
|
+
|
29
|
+
# A Logger based Log system, with levels. See Logger for more info.
|
30
|
+
#
|
31
|
+
# RBus::Log logs to STDOUT by default, it's possible to redirect this
|
32
|
+
# output to a file by setting a filename in the environment variable
|
33
|
+
# $RBUS_LOG_FILE.
|
34
|
+
# The default log level is ERROR, this can be adjusted by setting the
|
35
|
+
# environment variable $RBUS_LOG_LEVEL to FATAL, ERROR, WARN, INFO or
|
36
|
+
# DEBUG, or by setting RBus::Log.level=(new_level)
|
37
|
+
#
|
38
|
+
class Log
|
39
|
+
|
40
|
+
# Set a new log level. Takes either a symbol, like :ERROR or a string,
|
41
|
+
# like 'FATAL'.
|
42
|
+
def self.level=(new_level)
|
43
|
+
new_level = new_level.to_s
|
44
|
+
log_level = case new_level
|
45
|
+
when 'FATAL'
|
46
|
+
Logger::FATAL
|
47
|
+
when 'ERROR'
|
48
|
+
Logger::ERROR
|
49
|
+
when 'WARN'
|
50
|
+
Logger::WARN
|
51
|
+
when 'INFO'
|
52
|
+
Logger::INFO
|
53
|
+
when 'DEBUG'
|
54
|
+
Logger::DEBUG
|
55
|
+
else
|
56
|
+
Logger::ERROR
|
57
|
+
end
|
58
|
+
@@logger.level = log_level
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.pp(*objs)
|
62
|
+
sio = StringIO.new('')
|
63
|
+
sio.write(caller(2)[0])
|
64
|
+
sio.write("\n")
|
65
|
+
objs.each do |obj|
|
66
|
+
PP.pp(obj,sio)
|
67
|
+
end
|
68
|
+
sio.string
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.error(*objs)
|
72
|
+
@@logger.error(pp(objs))
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.warn(*objs)
|
76
|
+
@@logger.warn(pp(objs))
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.info(*objs)
|
80
|
+
@@logger.info(pp(objs))
|
81
|
+
end
|
82
|
+
|
83
|
+
def self.debug(*objs)
|
84
|
+
@@logger.debug(pp(objs))
|
85
|
+
end
|
86
|
+
|
87
|
+
def self.fatal(*objs)
|
88
|
+
@@logger.fatal(pp(objs))
|
89
|
+
end
|
90
|
+
|
91
|
+
# Initialize log object
|
92
|
+
log_target = ENV['RBUS_LOG_FILE'] || STDOUT
|
93
|
+
@@logger = Logger.new(log_target)
|
94
|
+
self.level = ENV['RBUS_LOG_LEVEL']
|
95
|
+
@@logger.formatter = lambda { |severity, time, progname, msg|
|
96
|
+
"%s: %s\n" % [severity, msg]
|
97
|
+
}
|
98
|
+
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
#--
|
2
|
+
#
|
3
|
+
# R-Bus is a native Ruby implementation of the D-Bus protocol.
|
4
|
+
# Copyright (C) 2007 Kristoffer Lundén (kristoffer.lunden@gmail.com)
|
5
|
+
#
|
6
|
+
# This program is free software; you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU General Public License as published by
|
8
|
+
# the Free Software Foundation; either version 2 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# This program is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with this program; if not, write to the Free Software
|
18
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
19
|
+
# MA 02110-1301, USA. A copy of the GNU General Public License is
|
20
|
+
# also available at http://www.gnu.org/copyleft/gpl.html.
|
21
|
+
#
|
22
|
+
#++
|
23
|
+
#
|
24
|
+
module RBus
|
25
|
+
|
26
|
+
class ObjectPath < String
|
27
|
+
end
|
28
|
+
|
29
|
+
class Variant
|
30
|
+
attr_reader :object_signature, :object
|
31
|
+
def initialize(object, signature)
|
32
|
+
@object_signature = signature
|
33
|
+
@object = object
|
34
|
+
end
|
35
|
+
|
36
|
+
def method_missing(name, *args, &block)
|
37
|
+
@object.send(name, *args, &block)
|
38
|
+
end
|
39
|
+
|
40
|
+
def ==(other)
|
41
|
+
other.object_signature == @object_signature && other.object == @object
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_s
|
45
|
+
@object.to_s
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_i
|
49
|
+
@object.to_i
|
50
|
+
end
|
51
|
+
|
52
|
+
def to_f
|
53
|
+
@object.to_f
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
#--
|
2
|
+
#
|
3
|
+
# R-Bus is a native Ruby implementation of the D-Bus protocol.
|
4
|
+
# Copyright (C) 2007 Kristoffer Lundén (kristoffer.lunden@gmail.com)
|
5
|
+
#
|
6
|
+
# This program is free software; you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU General Public License as published by
|
8
|
+
# the Free Software Foundation; either version 2 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# This program is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with this program; if not, write to the Free Software
|
18
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
19
|
+
# MA 02110-1301, USA. A copy of the GNU General Public License is
|
20
|
+
# also available at http://www.gnu.org/copyleft/gpl.html.
|
21
|
+
#
|
22
|
+
#++
|
23
|
+
#
|
24
|
+
module RBus #:nodoc:
|
25
|
+
module VERSION #:nodoc:
|
26
|
+
PROTOCOL = 1
|
27
|
+
|
28
|
+
MAJOR = 0
|
29
|
+
MINOR = 1
|
30
|
+
TINY = 0
|
31
|
+
|
32
|
+
STRING = [MAJOR, MINOR, TINY].join('.')
|
33
|
+
end
|
34
|
+
end
|
data/lib/rbus/glib.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#--
|
2
|
+
#
|
3
|
+
# R-Bus is a native Ruby implementation of the D-Bus protocol.
|
4
|
+
# Copyright (C) 2007 Kristoffer Lundén (kristoffer.lunden@gmail.com)
|
5
|
+
#
|
6
|
+
# This program is free software; you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU General Public License as published by
|
8
|
+
# the Free Software Foundation; either version 2 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# This program is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with this program; if not, write to the Free Software
|
18
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
19
|
+
# MA 02110-1301, USA. A copy of the GNU General Public License is
|
20
|
+
# also available at http://www.gnu.org/copyleft/gpl.html.
|
21
|
+
#
|
22
|
+
#++
|
23
|
+
#
|
24
|
+
base_dir = File.dirname(__FILE__)
|
25
|
+
%w{auth bus etc message}.each do |dir|
|
26
|
+
Dir[File.join(base_dir, dir, '*.rb')].sort.each { |lib| require lib }
|
27
|
+
end
|
28
|
+
|
29
|
+
require File.dirname(__FILE__) + '/mainloop/glib.rb'
|
@@ -0,0 +1,77 @@
|
|
1
|
+
#--
|
2
|
+
#
|
3
|
+
# R-Bus is a native Ruby implementation of the D-Bus protocol.
|
4
|
+
# Copyright (C) 2007 Kristoffer Lundén (kristoffer.lunden@gmail.com)
|
5
|
+
#
|
6
|
+
# This program is free software; you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU General Public License as published by
|
8
|
+
# the Free Software Foundation; either version 2 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# This program is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with this program; if not, write to the Free Software
|
18
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
19
|
+
# MA 02110-1301, USA. A copy of the GNU General Public License is
|
20
|
+
# also available at http://www.gnu.org/copyleft/gpl.html.
|
21
|
+
#
|
22
|
+
#++
|
23
|
+
#
|
24
|
+
require File.dirname(__FILE__) + '/mainloop'
|
25
|
+
require File.dirname(__FILE__) + '/observers'
|
26
|
+
require 'gtk2'
|
27
|
+
|
28
|
+
module RBus
|
29
|
+
class Mainloop
|
30
|
+
def setup
|
31
|
+
@active = true
|
32
|
+
@io_channel = GLib::IOChannel.new(@transport.socket.fileno)
|
33
|
+
@io_channel.add_watch(GLib::IOChannel::IN) do |ch, con|
|
34
|
+
if @active
|
35
|
+
message = @reader.read_message
|
36
|
+
handle_incoming(message)
|
37
|
+
end
|
38
|
+
true
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def send_message(message, callback = nil)
|
43
|
+
# TODO: if message has no_reply, use dummy observer
|
44
|
+
if message.member == 'AddMatch'
|
45
|
+
observer = SignalObserver.new(self, message.arguments[0], callback)
|
46
|
+
message.arguments = message.arguments[0].map{|key,value|"#{key}='#{value}'"}.join(',')
|
47
|
+
elsif callback
|
48
|
+
observer = AsyncObserver.new(self, message.serial, callback)
|
49
|
+
else
|
50
|
+
observer = nil
|
51
|
+
end
|
52
|
+
|
53
|
+
handle_outgoing(message)
|
54
|
+
|
55
|
+
# Handle sync reply right here.
|
56
|
+
if observer.nil?
|
57
|
+
@active = false
|
58
|
+
loop do
|
59
|
+
reply = @reader.read_message
|
60
|
+
next if reply.nil?
|
61
|
+
if message.serial == reply.serial
|
62
|
+
@active = true
|
63
|
+
return reply.arguments
|
64
|
+
else
|
65
|
+
handle_incoming(reply)
|
66
|
+
Gtk.main_iteration_do(false)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
def self.mainloop # :nodoc:
|
75
|
+
Gtk.main
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
#--
|
2
|
+
#
|
3
|
+
# R-Bus is a native Ruby implementation of the D-Bus protocol.
|
4
|
+
# Copyright (C) 2007 Kristoffer Lundén (kristoffer.lunden@gmail.com)
|
5
|
+
#
|
6
|
+
# This program is free software; you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU General Public License as published by
|
8
|
+
# the Free Software Foundation; either version 2 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# This program is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with this program; if not, write to the Free Software
|
18
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
19
|
+
# MA 02110-1301, USA. A copy of the GNU General Public License is
|
20
|
+
# also available at http://www.gnu.org/copyleft/gpl.html.
|
21
|
+
#
|
22
|
+
#++
|
23
|
+
#
|
24
|
+
require 'monitor'
|
25
|
+
require 'observer'
|
26
|
+
|
27
|
+
module RBus
|
28
|
+
|
29
|
+
class Mainloop
|
30
|
+
include Observable
|
31
|
+
include MonitorMixin
|
32
|
+
|
33
|
+
def initialize(transport)
|
34
|
+
super()
|
35
|
+
@transport = transport
|
36
|
+
@writer = Message::Writer.new(@transport)
|
37
|
+
@reader = Message::Reader.new(@transport)
|
38
|
+
setup
|
39
|
+
end
|
40
|
+
|
41
|
+
# Mainloop implementations should override this method to setup
|
42
|
+
# everything they need.
|
43
|
+
def setup
|
44
|
+
raise NotImplementedError, "No mainloop implemented"
|
45
|
+
end
|
46
|
+
|
47
|
+
# Mainloop implementations should call this method with
|
48
|
+
# any message received from the Bus.
|
49
|
+
# Handles +nil+ messages for non-blocking loops.
|
50
|
+
def handle_incoming(message)
|
51
|
+
return if message.nil?
|
52
|
+
|
53
|
+
# - empty NAMES is when Bus is connecting only
|
54
|
+
# - empty destination is for signals only
|
55
|
+
# - otherwise, NAMES must include the destination
|
56
|
+
return unless Bus::NAMES.empty? || message.destination.nil? || Bus::NAMES.include?(message.destination)
|
57
|
+
|
58
|
+
# The audience is listening... broadcast the new message.
|
59
|
+
changed
|
60
|
+
notify_observers(message)
|
61
|
+
end
|
62
|
+
|
63
|
+
# Mainloop implementations should call this method with
|
64
|
+
# any message to be sent to the Bus, and a callback, if available.
|
65
|
+
# Returns appropriate +observer+
|
66
|
+
def handle_outgoing(message)
|
67
|
+
# Make sure only one message is sent at each time.
|
68
|
+
synchronize do
|
69
|
+
@writer.send_message(message)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# Send message, tell loop to expect an answer. Overridden by
|
74
|
+
# implementations.
|
75
|
+
def send_message(message, callback = nil)
|
76
|
+
raise NotImplementedError, "No mainloop implemented"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# Start idle mainloop, overridden by different implementations.
|
81
|
+
def self.mainloop
|
82
|
+
raise NotImplementedError, "No mainloop implemented"
|
83
|
+
end
|
84
|
+
end
|