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