module XMLRPC::Convert

Helper class used to convert types.

Public Class Methods

base64(str) click to toggle source

Decodes the given str using XMLRPC::Base64.decode

# File lib/xmlrpc/parser.rb, line 135
def self.base64(str)
  XMLRPC::Base64.decode(str)
end
boolean(str) click to toggle source

Converts a String to true or false

Raises an exception if str is not 0 or 1

# File lib/xmlrpc/parser.rb, line 83
def self.boolean(str)
  case str
  when "0" then false
  when "1" then true
  else
    raise "RPC-value of type boolean is wrong"
  end
end
dateTime(str) click to toggle source

Converts a the given str to a dateTime.iso8601 formatted date.

Raises an exception if the String isn't in dateTime.iso8601 format.

See also, XMLRPC::DateTime

# File lib/xmlrpc/parser.rb, line 104
def self.dateTime(str)
  case str
  when /^(-?\d\d\d\d)-?(\d\d)-?(\d\d)T(\d\d):(\d\d):(\d\d)(?:Z|([+-])(\d\d):?(\d\d))?$/
    a = [$1, $2, $3, $4, $5, $6].collect{|i| i.to_i}
    if $7
      ofs = $8.to_i*3600 + $9.to_i*60
      ofs = -ofs if $7=='+'
      utc = Time.utc(*a) + ofs
      a = [ utc.year, utc.month, utc.day, utc.hour, utc.min, utc.sec ]
    end
    XMLRPC::DateTime.new(*a)
  when /^(-?\d\d)-?(\d\d)-?(\d\d)T(\d\d):(\d\d):(\d\d)(Z|([+-]\d\d):(\d\d))?$/
    a = [$1, $2, $3, $4, $5, $6].collect{|i| i.to_i}
    if a[0] < 70
      a[0] += 2000
    else
      a[0] += 1900
    end
    if $7
      ofs = $8.to_i*3600 + $9.to_i*60
      ofs = -ofs if $7=='+'
      utc = Time.utc(*a) + ofs
      a = [ utc.year, utc.month, utc.day, utc.hour, utc.min, utc.sec ]
    end
    XMLRPC::DateTime.new(*a)
  else
    raise "wrong dateTime.iso8601 format " + str
  end
end
double(str) click to toggle source

Converts a String to a Float

See also String#to_f

# File lib/xmlrpc/parser.rb, line 95
def self.double(str)
  str.to_f
end
fault(hash) click to toggle source

Converts the given hash to an XMLRPC::FaultException object by passing the faultCode and faultString attributes of the Hash to XMLRPC::FaultException.new

Raises an Exception if the given hash doesn't meet the requirements. Those requirements being:

  • 2 keys

  • 'faultCode' key is an Integer

  • 'faultString' key is a String

# File lib/xmlrpc/parser.rb, line 174
def self.fault(hash)
  if hash.kind_of? Hash and hash.size == 2 and
    hash.has_key? "faultCode" and hash.has_key? "faultString" and
    hash["faultCode"].kind_of? Integer and hash["faultString"].kind_of? String

    XMLRPC::FaultException.new(hash["faultCode"], hash["faultString"])
  else
    raise "wrong fault-structure: #{hash.inspect}"
  end
end
int(str) click to toggle source

Converts a String to an Integer

See also String#to_i

# File lib/xmlrpc/parser.rb, line 76
def self.int(str)
  str.to_i
end
struct(hash) click to toggle source

Converts the given hash to a marshalled object.

Returns the given hash if an exception occurs.

# File lib/xmlrpc/parser.rb, line 142
def self.struct(hash)
  # convert to marshalled object
  klass = hash["___class___"]
  if klass.nil? or Config::ENABLE_MARSHALLING == false
    hash
  else
    begin
      mod = Module
      klass.split("::").each {|const| mod = mod.const_get(const.strip)}

      obj = mod.allocate

      hash.delete "___class___"
      hash.each {|key, value|
        obj.instance_variable_set("@#{ key }", value) if key =~ /^([a-zA-Z_]\w*)$/
      }
      obj
    rescue
      hash
    end
  end
end