# =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/x'
require 'xmpp4r/jid'
module Jabber
module Roster
##
# Implementation of JEP-0144
# for
# attached to stanzas
#
# Should be backwards compatible to JEP-0093,
# as only action attribute of roster items are missing there.
# Pay attention to the namespace which is jabber:x:roster
# for JEP-0093!
class XRoster < X
name_xmlns 'x', 'jabber:x:roster'
end #Class XRoster
class RosterX < XRoster
name_xmlns 'x', 'http://jabber.org/protocol/rosterx'
end
##
# Class containing an element
#
# The 'name' attribute has been renamed to 'iname' here
# as 'name' is already used by REXML::Element for the
# element's name. It's still name='...' in XML.
#
# This is all a bit analoguous to Jabber::RosterItem, used by
# Jabber::IqQueryRoster. But this class lacks the subscription and
# ask attributes.
class XRosterItem < XMPPElement
name_xmlns 'item', 'jabber:x:roster'
##
# Construct a new roster item
# jid:: [JID] Jabber ID
# iname:: [String] Name in the roster
def initialize(jid=nil, iname=nil)
super()
self.jid = jid
self.iname = iname
end
##
# Get name of roster item
#
# names can be set by the roster's owner himself
# return:: [String]
def iname
attributes['name']
end
##
# Set name of roster item
# val:: [String] Name for this item
def iname=(val)
attributes['name'] = val
end
##
# Get JID of roster item
# Resource of the JID will _not_ be stripped
# return:: [JID]
def jid
JID.new(attributes['jid'])
end
##
# Set JID of roster item
# val:: [JID] or nil
def jid=(val)
attributes['jid'] = val.nil? ? nil : val.to_s
end
##
# Get action for this roster item
# * :add
# * :modify
# * :delete
# result:: [Symbol] (defaults to :add according to JEP-0144)
def action
case attributes['action']
when 'modify' then :modify
when 'delete' then :delete
else :add
end
end
##
# Set action for this roster item
# (see action)
def action=(a)
case a
when :modify then attributes['action'] = 'modify'
when :delete then attributes['action'] = 'delete'
else attributes['action'] = 'add'
end
end
##
# Get groups the item belongs to
# result:: [Array] of [String] The groups
def groups
result = []
each_element('group') { |group|
result.push(group.text)
}
result
end
##
# Set groups the item belongs to,
# deletes old groups first.
#
# See JEP 0083 for nested groups
# ary:: [Array] New groups, duplicate values will be removed
def groups=(ary)
# Delete old group elements
delete_elements('group')
# Add new group elements
ary.uniq.each { |group|
add_element('group').text = group
}
end
end #Class XRosterItem
class RosterXItem < XRosterItem
name_xmlns 'item', 'http://jabber.org/protocol/rosterx'
end
end #Module Roster
end #Module Jabber