# class DBus::Service

This represents a remote service. It should not be instantiated directly Use Bus::service()

### Attributes

bus[R]

The bus the service is running on.

name[R]

The service name.

root[R]

The service root (FIXME).

### Public Class Methods

new(name, bus) click to toggle source

Create a new service with a given name on a given bus.

    # File lib/dbus/bus.rb, line 30
    def initialize(name, bus)
      @name, @bus = name, bus
      @root = Node.new("/")
    end

### Public Instance Methods

exists?() click to toggle source

Determine whether the service name already exists.

    # File lib/dbus/bus.rb, line 36
    def exists?
      bus.proxy.ListNames[0].member?(@name)
    end

export(obj) click to toggle source

Export an object obj (an DBus::Object subclass instance).

    # File lib/dbus/bus.rb, line 62
    def export(obj)
      obj.service = self
      get_node(obj.path, true).object = obj
    end

get_node(path, create = false) click to toggle source

Get the object node corresponding to the given path. if create is true, the the nodes in the path are created if they do not already exist.

    # File lib/dbus/bus.rb, line 85
    def get_node(path, create = false)
      n = @root
      path.sub(/^\//, "").split("/").each do |elem|
        if not n[elem]
          if not create
            return nil
          else
            n[elem] = Node.new(elem)
          end
        end
        n = n[elem]
      end
      if n.nil?
        DBus.logger.debug "Warning, unknown object #{path}"
      end
      n
    end

introspect() click to toggle source

Perform an introspection on all the objects on the service (starting recursively from the root).

    # File lib/dbus/bus.rb, line 42
    def introspect
      if block_given?
        raise NotImplementedError
      else
        rec_introspect(@root, "/")
      end
      self
    end

object(path) click to toggle source

Retrieves an object at the given path. @return [ProxyObject]

    # File lib/dbus/bus.rb, line 53
    def object(path)
      node = get_node(path, true)
      if node.object.nil?
        node.object = ProxyObject.new(@bus, @name, path)
      end
      node.object
    end

unexport(obj) click to toggle source

Undo exporting an object obj. Raises ArgumentError if it is not a DBus::Object. Returns the object, or false if obj was not exported.

    # File lib/dbus/bus.rb, line 70
    def unexport(obj)
      raise ArgumentError.new("DBus::Service#unexport() expects a DBus::Object argument") unless obj.kind_of?(DBus::Object)
      return false unless obj.path
      pathSep = obj.path.rindex("/") #last path seperator
      parent_path = obj.path[1..pathSep-1]
      node_name = obj.path[pathSep+1..-1]

      parent_node = get_node(parent_path, false)
      return false unless parent_node
      obj.service = nil
      parent_node.delete(node_name)
    end

### Private Instance Methods

rec_introspect(node, path) click to toggle source

Perform a recursive retrospection on the given current node on the given path.

    # File lib/dbus/bus.rb, line 109
    def rec_introspect(node, path)
      xml = bus.introspect_data(@name, path)
      intfs, subnodes = IntrospectXMLParser.new(xml).parse
      subnodes.each do |nodename|
        subnode = node[nodename] = Node.new(nodename)
        if path == "/"
          subpath = "/" + nodename
        else
          subpath = path + "/" + nodename
        end
        rec_introspect(subnode, subpath)
      end
      if intfs.size > 0
        node.object = ProxyObjectFactory.new(xml, @bus, @name, path).build
      end
    end