# =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/iq' require 'xmpp4r/base64' module Jabber module Vcard ## # vCard container for User Information # (can be specified by users themselves, mostly kept on servers) # (JEP 0054) class IqVcard < XMPPElement name_xmlns 'vCard', 'vcard-temp' force_xmlns true ## # Initialize a element # fields:: [Hash] Initialize with keys as XPath element names and values for element texts def initialize(fields=nil) super() unless fields.nil? fields.each { |name,value| self[name] = value } end end ## # Get an elements/fields text # # vCards have too much possible children, so ask for them here # and extract the result with iqvcard.element('...').text # name:: [String] XPath def [](name) text = nil each_element(name) { |child| text = child.text } text end ## # Set an elements/fields text # name:: [String] XPath # text:: [String] Value def []=(name, text) xe = self name.split(/\//).each do |elementname| # Does the children already exist? newxe = nil xe.each_element(elementname) { |child| newxe = child } if newxe.nil? # Create a new xe = xe.add_element(elementname) else # Or take existing xe = newxe end end xe.text = text end ## # Get vCard field names # # Example: # ["NICKNAME", "BDAY", "ORG/ORGUNIT", "PHOTO/TYPE", "PHOTO/BINVAL"] # # result:: [Array] of [String] def fields element_names(self).uniq end ## # Get the PHOTO/BINVAL (Avatar picture) field decoded from Base64 # result:: [String] or [nil] def photo_binval if (binval = self['PHOTO/BINVAL']) Base64::decode64(binval) else nil end end private ## # Recursive helper function, # returns all element names in an array, concatenated # to their parent's name with a slash def element_names(xe, prefix='') # :nodoc: res = [] xe.each_element { |child| if child.kind_of?(REXML::Element) children = element_names(child, "#{prefix}#{child.name}/") if children == [] res.push("#{prefix}#{child.name}") else res += children end end } res end end end end