# 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 100
    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 48
    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 69
    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 60
    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 139
    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 41
    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 107
    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