class Jabber::Discovery::Responder

Responds to Service Discovery queries on a given node

Modify returned elements by these attributes:

Constants

CALLBACK_PRIORITY

Attributes

features[RW]

Features returned on Discovery Info query,

Array of [Discovery::Feature]

forms[RW]

Forms returned on Discovery Info query (such as Software Information)

Array of [Dataforms::XData]

identities[RW]

Identities returned on Discovery Info query

Array of [Discovery::Identity]

items[RW]

Children returned on Discovery Item query

May contain other Discovery::Responder instances which will generate an item dynamically from their first identity

Array of [Discovery::Item] or [Discovery::Responder] (mixed)

my_jid[RW]

Set the JID this helper feels responsible for (default: nil, responsible for any JID)

node[R]

Service Discovery node this Responder is responsible for (will not answer queries for other nodes)

Public Class Methods

new(stream, node=nil, identities=[], features=[], items=[]) click to toggle source

Initialize responder for a specific node

stream
Jabber::Stream
node
nil

or [String]

# File lib/xmpp4r/discovery/helper/responder.rb, line 64
def initialize(stream, node=nil, identities=[], features=[], items=[])
  @stream = stream
  @my_jid = nil
  @node = node
  @identities = identities
  @features = []
  add_features(features)
  @forms = []
  @items = items

  @stream.add_iq_callback(CALLBACK_PRIORITY, self) do |iq|
    my_nodes = [@node, "#{@node}##{generate_ver}"]

    if iq.type == :get and
       iq.query.kind_of? IqQueryDiscoInfo and
       my_nodes.include?(iq.query.node)

      answer = iq.answer(false)
      answer.type = :result
      query = answer.add(IqQueryDiscoInfo.new)
      query.node = iq.query.node
      (@identities + @features + @forms).each do |element|
        query.add(element)
      end
      @stream.send(answer)

      true  # handled

    elsif iq.type == :get and
          iq.query.kind_of? IqQueryDiscoItems and
          my_nodes.include?(iq.query.node)

      answer = iq.answer(false)
      answer.type = :result
      query = answer.add(IqQueryDiscoItems.new)
      query.node = iq.query.node
      @items.each do |item|
        if item.kind_of? Responder
          query.add(item.generate_item)
        else
          query.add(item)
        end
      end
      @stream.send(answer)

      true  # handled

    else
      false # not handled
    end
  end
end

Public Instance Methods

add_feature(feature) click to toggle source

Add a feature

feature
Jabber::Discovery::Feature

or [String]

# File lib/xmpp4r/discovery/helper/responder.rb, line 120
def add_feature(feature)
  if feature.kind_of? Feature
    @features << feature
  else
    @features << Feature.new(feature.to_s)
  end
end
add_features(features) click to toggle source

Add a series of features

features

Array of [Jabber::Discovery::Feature] or [String]

# File lib/xmpp4r/discovery/helper/responder.rb, line 131
def add_features(features)
  features.each { |feature|
    add_feature(feature)
  }
end
generate_caps() click to toggle source

Generate a XEP-0115: Entity Capabilities <c/> element for inclusion in Presence stanzas. This enables efficient caching of Service Discovery information.

# File lib/xmpp4r/discovery/helper/responder.rb, line 141
def generate_caps
  Caps::C.new(@node, generate_ver)
end
generate_item() click to toggle source

Generate an item for inclusion in items discovery in other responders

return
Discovery::Item

or nil

# File lib/xmpp4r/discovery/helper/responder.rb, line 149
def generate_item
  i = @identities.first
  if i
    Item.new(@my_jid || @stream.jid, i.iname, @node)
  else
    nil
  end
end

Private Instance Methods

generate_ver() click to toggle source
# File lib/xmpp4r/discovery/helper/responder.rb, line 160
def generate_ver
  Caps::generate_ver(@identities, @features, @forms)
end