class DBus::Wrapper::ProcessWatch
Constants
- DBUS_ID_REGEXP
Public Class Methods
new(bus, process_name_regexp = /.*/)
click to toggle source
# File lib/ruby-dbus-wrapper-process-watch/process_watch.rb, line 9 def initialize(bus, process_name_regexp = /.*/) @bus = bus @process_name_regexp = process_name_regexp @known_id_to_name = {} @known_name_to_id = {} @pending = {} @events = { :resolved => [], :registered => [], :unregistered => [] } end
Public Instance Methods
on(event_name, &block)
click to toggle source
# File lib/ruby-dbus-wrapper-process-watch/process_watch.rb, line 26 def on(event_name, &block) raise ArgumentError, "Invalid event name #{event_name}" unless @events.keys.include? event_name.to_sym raise ArgumentError, "You must pass a block" unless block_given? @events[event_name.to_sym] << block end
resolve_id_to_name(id)
click to toggle source
# File lib/ruby-dbus-wrapper-process-watch/process_watch.rb, line 39 def resolve_id_to_name(id) @known_id_to_name[id] end
resolve_name_to_id(name)
click to toggle source
# File lib/ruby-dbus-wrapper-process-watch/process_watch.rb, line 34 def resolve_name_to_id(name) @known_name_to_id[name] end
start!()
click to toggle source
# File lib/ruby-dbus-wrapper-process-watch/process_watch.rb, line 20 def start! @bus.monitor_signal("org.freedesktop.DBus", nil, "org.freedesktop.DBus", "NameOwnerChanged") { |message| on_name_owner_changed_signal(message) } @bus.method_call("org.freedesktop.DBus", "/", "org.freedesktop.DBus", "ListNames") { |message| on_list_names_return(message) } end
Private Instance Methods
is_monitored_process_name?(name)
click to toggle source
# File lib/ruby-dbus-wrapper-process-watch/process_watch.rb, line 69 def is_monitored_process_name?(name) not name.match(DBUS_ID_REGEXP) and not name == "org.freedesktop.DBus" and name.match(@process_name_regexp) end
on_list_names_return(message)
click to toggle source
# File lib/ruby-dbus-wrapper-process-watch/process_watch.rb, line 86 def on_list_names_return(message) raise NameResolutionFatalError, "Unable to query list of DBus names (#{message})" if message.is_a? DBus::Error message.params.first.each do |name| if is_monitored_process_name?(name) @pending[name] = true end end if @pending.size == 0 trigger :resolved else @pending.keys.each do |name| @bus.method_call("org.freedesktop.DBus", "/", "org.freedesktop.DBus", "GetNameOwner", [[ DBus::Type::STRING, name]]) do |message| if message.is_a? DBus::Error raise NameResolutionRecoverableError, "Unable to get DBus ID of of DBus process #{name} (#{message}) - most probably it has disappeared during query" else register name, message.params.first @pending.delete name trigger :resolved if @pending.size == 0 end end end end end
on_name_owner_changed_signal(message)
click to toggle source
# File lib/ruby-dbus-wrapper-process-watch/process_watch.rb, line 74 def on_name_owner_changed_signal(message) if is_monitored_process_name?(message.params[0]) if message.params[1] == '' and message.params[2] =~ DBUS_ID_REGEXP register message.params[0], message.params[2] elsif message.params[2] == '' and message.params[1] =~ DBUS_ID_REGEXP unregister message.params[0] end end end
register(name, id)
click to toggle source
# File lib/ruby-dbus-wrapper-process-watch/process_watch.rb, line 53 def register(name, id) @known_name_to_id[name] = id @known_id_to_name[id] = name trigger :registered, name end
trigger(event_name, *args)
click to toggle source
# File lib/ruby-dbus-wrapper-process-watch/process_watch.rb, line 46 def trigger(event_name, *args) @events[event_name].each do |callback| callback.call *args end end
unregister(name)
click to toggle source
# File lib/ruby-dbus-wrapper-process-watch/process_watch.rb, line 61 def unregister(name) @known_id_to_name.delete @known_name_to_id[name] @known_name_to_id.delete name trigger :unregistered, name end