# =XMPP4R - XMPP Library for Ruby
# License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
# Website::http://home.gna.org/xmpp4r/
require 'xmpp4r/xmppstanza'
require 'xmpp4r/jid'
require 'digest/sha1'
require 'xmpp4r/query'
require 'xmpp4r/vcard/iq/vcard'
module Jabber
##
# IQ: Information/Query
# (see RFC3920 - 9.2.3
#
# A class used to build/parse IQ requests/responses
class Iq < XMPPStanza
name_xmlns 'iq', 'jabber:client'
force_xmlns true
@@element_classes = {}
##
# Build a new stanza
# type:: [Symbol] or nil, see Iq#type
# to:: [JID] Recipient
def initialize(type = nil, to = nil)
super()
if not to.nil?
set_to(to)
end
if not type.nil?
set_type(type)
end
end
##
# Get the type of the Iq stanza
#
# The following values are allowed:
# * :get
# * :set
# * :result
# * :error
# result:: [Symbol] or nil
def type
case super
when 'get' then :get
when 'set' then :set
when 'result' then :result
when 'error' then :error
else nil
end
end
##
# Set the type of the Iq stanza (see Iq#type)
# v:: [Symbol] or nil
def type=(v)
case v
when :get then super('get')
when :set then super('set')
when :result then super('result')
when :error then super('error')
else super(nil)
end
end
##
# Set the type of the Iq stanza (chaining-friendly)
# v:: [Symbol] or nil
def set_type(v)
self.type = v
self
end
##
# Returns the iq's query child, or nil
# result:: [IqQuery]
def query
first_element('query')
end
##
# Delete old elements named newquery.name
#
# newquery:: [REXML::Element] will be added
def query=(newquery)
delete_elements(newquery.name)
add(newquery)
end
##
# Returns the iq's query's namespace, or nil
# result:: [String]
def queryns
e = first_element('query')
if e
return e.namespace
else
return nil
end
end
##
# Returns the iq's child, or nil
# result:: [IqVcard]
def vcard
first_element('vCard')
end
##
# Returns the iq's child, or nil
# result:: [IqVcard]
def pubsub
first_element('pubsub')
end
##
# Returns the iq's child, or nil
# resulte:: [IqCommand]
def command
first_element("command")
end
##
# Create a new Iq stanza with an unspecified query child
# ( has no namespace)
def Iq.new_query(type = nil, to = nil)
iq = Iq.new(type, to)
query = IqQuery.new
iq.add(query)
iq
end
##
# Create a new jabber:iq:auth set Stanza.
def Iq.new_authset(jid, password)
iq = Iq.new(:set)
query = IqQuery.new
query.add_namespace('jabber:iq:auth')
query.add(REXML::Element.new('username').add_text(jid.node))
query.add(REXML::Element.new('password').add_text(password))
query.add(REXML::Element.new('resource').add_text(jid.resource)) if not jid.resource.nil?
iq.add(query)
iq
end
##
# Create a new jabber:iq:auth set Stanza for Digest authentication
def Iq.new_authset_digest(jid, session_id, password)
iq = Iq.new(:set)
query = IqQuery.new
query.add_namespace('jabber:iq:auth')
query.add(REXML::Element.new('username').add_text(jid.node))
query.add(REXML::Element.new('digest').add_text(Digest::SHA1.hexdigest(session_id + password)))
query.add(REXML::Element.new('resource').add_text(jid.resource)) if not jid.resource.nil?
iq.add(query)
iq
end
##
# Create a new jabber:iq:register set stanza for service/server registration
# username:: [String] (Element will be ommited if unset)
# password:: [String] (Element will be ommited if unset)
def Iq.new_register(username=nil, password=nil)
iq = Iq.new(:set)
query = IqQuery.new
query.add_namespace('jabber:iq:register')
query.add(REXML::Element.new('username').add_text(username)) if username
query.add(REXML::Element.new('password').add_text(password)) if password
iq.add(query)
iq
end
##
# Create a new jabber:iq:register get stanza for retrieval
# of accepted registration information
def Iq.new_registerget
iq = Iq.new(:get)
query = IqQuery.new
query.add_namespace('jabber:iq:register')
iq.add(query)
iq
end
##
# Create a new jabber:iq:roster get Stanza.
#
# IqQueryRoster is unused here because possibly not require'd
def Iq.new_rosterget
iq = Iq.new(:get)
query = IqQuery.new
query.add_namespace('jabber:iq:roster')
iq.add(query)
iq
end
##
# Create a new jabber:iq:roster get Stanza.
def Iq.new_browseget
iq = Iq.new(:get)
query = IqQuery.new
query.add_namespace('jabber:iq:browse')
iq.add(query)
iq
end
##
# Create a new jabber:iq:roster set Stanza.
def Iq.new_rosterset
iq = Iq.new(:set)
query = IqQuery.new
query.add_namespace('jabber:iq:roster')
iq.add(query)
iq
end
end
end