module Ethon::Curls::Options
def set_option(option, value, handle, type = :easy)
def set_option(option, value, handle, type = :easy) type = type.to_sym unless type.is_a?(Symbol) raise NameError, "Ethon::Curls::Options unknown type #{type}." unless respond_to?(OPTION_STRINGS[type]) opthash=send(OPTION_STRINGS[type], nil) raise Errors::InvalidOption.new(option) unless opthash.include?(option) case opthash[option][:type] when :none return if value.nil? value=1 va_type=:long when :int return if value.nil? va_type=:long value=value.to_i when :bool return if value.nil? va_type=:long value=(value&&value!=0) ? 1 : 0 when :time return if value.nil? va_type=:long value=value.to_i when :enum return if value.nil? va_type=:long value = case value when Symbol opthash[option][:opts][value] when String opthash[option][:opts][value.to_sym] else value end.to_i when :bitmask return if value.nil? va_type=:long value = case value when Symbol opthash[option][:opts][value] when Array value.inject(0) { |res,v| res|opthash[option][:opts][v] } else value end.to_i when :string va_type=:string value=value.to_s unless value.nil? when :string_as_pointer va_type = :pointer s = '' s = value.to_s unless value.nil? value = FFI::MemoryPointer.new(:char, s.bytesize) value.put_bytes(0, s) when :string_escape_null va_type=:string value=Util.escape_zero_byte(value) unless value.nil? when :ffipointer va_type=:pointer raise Errors::InvalidValue.new(option,value) unless value.nil? or value.is_a? FFI::Pointer when :curl_slist va_type=:pointer raise Errors::InvalidValue.new(option,value) unless value.nil? or value.is_a? FFI::Pointer when :buffer raise NotImplementedError, "Ethon::Curls::Options option #{option} buffer type not implemented." when :dontuse_object raise NotImplementedError, "Ethon::Curls::Options option #{option} type not implemented." when :cbdata raise NotImplementedError, "Ethon::Curls::Options option #{option} callback data type not implemented. Use Ruby closures." when :callback va_type=:callback raise Errors::InvalidValue.new(option,value) unless value.nil? or value.is_a? Proc when :socket_callback va_type=:socket_callback raise Errors::InvalidValue.new(option,value) unless value.nil? or value.is_a? Proc when :timer_callback va_type=:timer_callback raise Errors::InvalidValue.new(option,value) unless value.nil? or value.is_a? Proc when :debug_callback va_type=:debug_callback raise Errors::InvalidValue.new(option,value) unless value.nil? or value.is_a? Proc when :progress_callback va_type=:progress_callback raise Errors::InvalidValue.new(option,value) unless value.nil? or value.is_a? Proc when :off_t return if value.nil? va_type=:int64 value=value.to_i end if va_type==:long or va_type==:int64 then bits=FFI.type_size(va_type)*8 tv=((value<0) ? value.abs-1 : value) raise Errors::InvalidValue.new(option,value) unless tv<(1<<bits) end send(FUNCS[type], handle, opthash[option][:opt], va_type, value) end